【问题标题】:Override Seed method in Entity Framework在实体框架中覆盖种子方法
【发布时间】:2014-01-28 14:44:22
【问题描述】:

我有一个对象类:

 public  class Post
  {
     public int Id { get; set; }
     public string Title { get; set; }
     public string Content { get; set; }
  }

我实现了一个类来覆盖这样的种子方法:

 public class MyCustomInitialize : DropCreateDatabaseIfModelChanges<Context>
{
    protected override void Seed(Context context)
    {
        context.Posts.Add(new Post() { Content = "This is a test", Id = 2, Title = "my subject" });
        context.Database.ExecuteSqlCommand("CREATE INDEX IX_title ON Blog (title)");
        base.Seed(context);
    }
}

在 Program.cs 中:

 Database.SetInitializer(new  MyCustomInitialize());

但是当我运行我的程序时,我想添加到我的数据库中的记录(标题为“我的主题”),它没有插入到我的数据库中,并且索引也没有创建!有什么问题?

【问题讨论】:

    标签: c# entity-framework entity-framework-5


    【解决方案1】:

    您需要在 DbContext 上调用 SaveChanges。

    【讨论】:

    • 在种子方法中 base.Seed(context) 将保存更改
    • 我在我的上下文中添加了 SaveChange.. 但它不起作用!!
    • 所以,刚刚看到这是一个控制台应用程序。在调用 Database.SetInitalizer 之后尝试调用 Database.Initalize(true)。
    【解决方案2】:

    SetInitializer 调用应该在 Application_Start() 事件中的 global.asax 中。

    protected void Application_Start()
    {
        System.Data.Entity.Database.SetInitializer(new MyCustomInitialize());
    }
    

    编辑:正如 amarano 在他们的回答中所说,数据库尚未使用新的“帖子”进行更新,因为您尚未调用 SaveChanges...

    这让我想知道您是如何检查索引是否已应用的?

    你也应该调用

    Context.Entry(TheTrackedEntityYouWantToUpdate).Reload();
    

    在调用 ExecuteSqlCommand 后更新本地(内存中的实体)。

    【讨论】:

    • 这是一个控制台应用程序不是一个网络应用程序
    猜你喜欢
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多