1

当实体的属性发生变化时,进行更新的正确方法是什么?例如,我有一个名为 Application 的实体。应用程序有一个属性 List<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,但我在智能感知中没有看到任何对我有帮助的东西。

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

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

编辑:

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

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

    this.SaveChanges<Application>(application);
}

那是必须要做的吗?那是正确的方法吗?

4

1 回答 1

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 容器来管理其生命周期,稍微抽象一下您的上下文。

于 2012-05-28T05:44:52.800 回答