在实体框架4.3中更新实体属性的正确方法 - 代码优先

时间:2012-05-27 22:32:29

标签: c# entity-framework

当实体属性发生变化时,更新的正确方法是什么?例如,我有一个名为Application的实体。应用程序具有属性List< TaskBases>。运行我的应用程序时,Application没有任何TaskBases。我只需要知道当用户向其添加TaskBase时如何保存此列表。

Save()方法的第一行是新的。我试过它是因为我在研究时发现了它。

public void Save(Application application)
{
    // This line didn't work. See error below this code snippet.
    this.Database.Entry(application).Property(app => app.Tasks).IsModified = true;
    this.SaveChanges<Application>(application);
}

protected void SaveChanges<T>(T entity) where T : EntityBase
{
    this.Database.Entry<T>(entity).State = GetState(entity);
    this.Database.SaveChanges();
}

我收到此错误: “类型'Application'上的属性'Tasks'不是原始属性或复杂属性.Property方法只能用于原始或复杂属性。使用Reference或Collection方法。”

然后我尝试使用Reference和Collection,但是我没有在intellisense中看到任何可以帮助我的东西。

注意:当我第一次尝试在Save()中没有第一行的情况下进行保存时,任务列表中的项目没有显示在数据库中。

我有一种感觉,我正在变得比它需要的更难。我有一个实体,一个用户添加另一个实体,作为列表的一部分,我想要保存。我错过了什么?该怎么做?

修改

当我将Save()方法更改为此方法时,它起作用了:

public void Save(Application application)
{
    foreach (TaskBase taskBase in application.Tasks)
    {
        this.Database.Entry<TaskBase>(taskBase).State = GetState(taskBase);
    }

    this.SaveChanges<Application>(application);
}

这是必须做的吗?这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

执行更新的常规方法如下:

using(var context = new MyDbContext())
{
    var app = context.Applications.Single(a=>a.Id == theAppIdImInterestedIn); 
    app.Tasks.Add(new Task{ Name = "some other data" });
    context.SaveChanges();
}

如果你想用一个DI容器管理它的生命周期,可以将你的上下文分开一点。