我在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");
}
}
答案 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>();
}
感谢