我们可以先在EF代码中混合新表和现有视图吗?

时间:2016-09-09 20:21:22

标签: entity-framework ef-code-first

我在db中为那些具有迁移的类创建了一些类和一个表。我通过向类中添加一些数据来测试我的代码,由EF保存,并在db。中正确保存数据。

后来当我在db中创建一个视图并在代码中对该视图进行maped时,问题就开始了。当我试图以这种方式查询时:

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

我收到了类似

的错误消息

附加信息:自创建数据库以来,支持'TestDBContext'上下文的模型已更改。请考虑使用“代码优先迁移”来更新数据库

所以EF告诉我迁移功能以在db中创建视图但视图已经存在。那么为什么我需要通过迁移来重新创建呢?

我的完整代码,包含视图映射和类

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");
    }
}

稍后我尝试查看是否有任何迁移正在等待发出Add-Migration“My_vwCustomer”。我看到了新的迁移代码,如下所示。似乎没有悬而未决的迁移。

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");
        }
    }

1 个答案:

答案 0 :(得分:0)

我们可以采用另一种方式来解决我的问题。看到代码。

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

代码来自https://stackoverflow.com/a/6143116/6188148

我们也可以遵循这种方法。

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

        }

        public override void Down()
        {
        }
    }

我想这也行得通,但我自己没有测试过。

我们可以使用Fluent API使用Ignore方法对其进行配置:

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

感谢