我有一个优先级类,它有一个日期时间列。该列在SQL中有一个默认值(EF生成数据库和表后,我将默认值CreatedDate
更改为getdate()
)。所以我只想插入优先级的其他列,但EF不允许我,并给出了这个错误:
System.InvalidOperationException:自创建数据库以来,支持"ToDoModel"上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer。例如,RecreaeDatabaseIfModelChanges策略将自动删除和重新创建数据库,并可选择为其添加新数据。
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);
}
这里有一个有用的链接,可以解释如果模型发生变化,如何删除和重新创建数据库。http://davidhayden.com/blog/dave/archive/2011/04/27/DatabaseInitializersEFCodeFirstDatabaseSetInitializer.aspx
这里有一个类似的,也许有帮助的问题和答案在这里SO…HTH如何使用实体框架管理GetDate()
在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);
}