0

I created some classes and a table in db for those classes with migration. I tested my code by adding some data to the classes,saved by EF and saw the data saved properly in db.

Later when I created a view in db and maped that view in code the problems started. When I tried to query this way:

 using (var db = new TestDBContext())
    {
        var listMyViews = db.vwCustomer.ToList();
    }

I was getting an error message like

Additional information: The model backing the 'TestDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database

So EF is telling me to migrate features to create view in db but view exists already. So why do I need to recreate it by migration?

my full code with view mapping and class

public class CustomerBase
{
    public int CustomerID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string Address1 { get; set; }
    public string Address2 { get; set; }

    public string Phone { get; set; }
    public string Fax { get; set; }

}

public class Customer : CustomerBase
{
    public virtual List<Addresses> Addresses { get; set; }
}

public class Addresses
{
    [Key]
    public int AddressID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public bool IsDefault { get; set; }
    public virtual List<Contacts> Contacts { get; set; }

    public int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }
}

public class Contacts
{
    [Key]
    public int ContactID { get; set; }

    public string Phone { get; set; }
    public string Fax { get; set; }
    public bool IsDefault { get; set; }

    public int AddressID { get; set; }
    public virtual Addresses Customer { get; set; } 

}

public class vwCustomer
        {
            public int CustomerID { get; set; }
            public string FirstName { get; set; }

        }

public class TestDBContext : DbContext
{
    public TestDBContext()
        : base("name=TestDBContext")
    {
    }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new vwCustomerConfiguration());
        }

    public DbSet<Customer> Customer { get; set; }
    public DbSet<Addresses> Addresses { get; set; }
    public DbSet<Contacts> Contacts { get; set; }
    public DbSet<vwCustomer> vwCustomer { get; set; }
}

public class vwCustomerConfiguration : EntityTypeConfiguration<vwCustomer>
{
    public vwCustomerConfiguration()
    {
        this.HasKey(t => t.CustomerID);
        this.ToTable("vwCustomer");
    }
}

Later I tried to see if any migration is pending issuing Add-Migration "My_vwCustomer". I saw new migration code being added as below. It seems there is no migration pending.

public partial class My_vwCustomer : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.vwCustomers",
                c => new
                    {
                        CustomerID = c.Int(nullable: false, identity: true),
                        FirstName = c.String(),
                    })
                .PrimaryKey(t => t.CustomerID);

        }

        public override void Down()
        {
            DropTable("dbo.vwCustomers");
        }
    }
StefanM
  • 797
  • 1
  • 10
  • 17
Monojit Sarkar
  • 2,353
  • 8
  • 43
  • 94

1 Answers1

0

Another way we can do it and it solve my problem. see the code.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

code taken from here https://stackoverflow.com/a/6143116/6188148

we can follow this approach too.

public partial class AddingvwCustomer : DbMigration
    {
        public override void Up()
        {

        }

        public override void Down()
        {
        }
    }

i guess this will works too but not tested myself.

we can use the Fluent API to configure it using the Ignore method:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Ignore<MyClass>();
}

thanks

Community
  • 1
  • 1
Monojit Sarkar
  • 2,353
  • 8
  • 43
  • 94