我有一个具有datetime列的Priority类。此列在SQL中具有默认值(在EF生成数据库和表之后,我将默认值CreatedDate
更改为getdate()
)。所以我只想插入优先级的其他列,但EF不允许我并给出此错误:
System.InvalidOperationException:自创建数据库以来,支持“ToDoModel”上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择为其添加新数据。
public class Priority
{
public int ID { get; set; }
public string Name { get; set; }
public string Color { get; set; }
public string Image { get; set; }
public DateTime CreatedDate { get; set; }
}
public class ToDoModel:DbContext
{
public ToDoModel() : base("ToDoList.ConnectionString") {
}
public DbSet<Priority> Priorites { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Priority>().MapSingleType().ToTable("tblPriority");
modelBuilder.Entity<Priority>().HasKey(x => x.ID);
modelBuilder.Entity<Priority>().Property(x => x.CreatedDate).StoreGeneratedPattern = StoreGeneratedPattern.Computed;
base.OnModelCreating(modelBuilder);
}
}
[TestMethod]
public void CanAddPriority()
{
var priority = new Priority();
priority.Color = "red";
priority.Image = "critical.jpg";
priority.Name = "Critical";
db.Priorites.Add(priority);
db.SaveChanges();
Assert.IsTrue(priority.ID > 0);
}
答案 0 :(得分:2)
这是一个有用的链接,用于解释如何在模型更改时删除并重新创建数据库。 http://davidhayden.com/blog/dave/archive/2011/04/27/DatabaseInitializersEFCodeFirstDatabaseSetInitializer.aspx
这里有一个类似的,也许是有用的问题和答案,关于SO ... HTH How to manage GetDate() with Entity Framework
答案 1 :(得分:2)
在OnModelCreating
方法中,我将modelBuilder.IncludeMetadataInDatabase
设置为false,现在一切正常。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Priority>().MapSingleType().ToTable("tblPriority");
modelBuilder.Entity<Priority>().HasKey(x => x.ID);
modelBuilder.Entity<Priority>().Property(x => x.CreatedDate).StoreGeneratedPattern = System.Data.Metadata.Edm.StoreGeneratedPattern.Computed;
modelBuilder.IncludeMetadataInDatabase = false;
base.OnModelCreating(modelBuilder);
}