EF - 代码优先 - SQL 默认值 getdate() 给出错误
Posted
技术标签:
【中文标题】EF - 代码优先 - SQL 默认值 getdate() 给出错误【英文标题】:EF - Code First - SQL Default Value getdate() gives error 【发布时间】:2011-06-24 13:56:35 【问题描述】:我有一个包含日期时间列的 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);
【问题讨论】:
【参考方案1】:这是一个有用的链接,用于说明在模型更改时如何删除和重新创建数据库。 http://davidhayden.com/blog/dave/archive/2011/04/27/DatabaseInitializersEFCodeFirstDatabaseSetInitializer.aspx
这里有一个类似的,也许有帮助的问题和答案,关于 SO...HTH How to manage GetDate() with Entity Framework
【讨论】:
我使用了 Database.SetInitializer(new RecreateDatabaseIfModelChangesdatetime2
类型的SQL Server 2005
。我不明白为什么 EF 会这样做,因为我将 StoreGeneratedPattern
设置为 Computed
【参考方案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);
【讨论】:
以上是关于EF - 代码优先 - SQL 默认值 getdate() 给出错误的主要内容,如果未能解决你的问题,请参考以下文章
EF 6.X 中的实体框架代码优先 Fluent API 默认值