ef代码首先保存多个现有项目的关系

时间:2014-06-21 20:45:13

标签: entity-framework ef-code-first

我首先使用EF 6代码来管理我的数据库。我有一个任务类

public class Task{
    public Guid Id { get; set; }
    public ICollection<Timeframe> Timeframes { get; set; }
}

和一个看起来像

的Timeframe类
public class Timeframe{
    public Guid Id { get; set; }
    public ICollection<Task> Tasks { get; set; }
}

这创建了正确的多对多表结构。我的应用程序工作流程使得任务和时间范围在保存任务/时间范围关系之前都将存在。一旦创建关系,我就无法保持关系。我理解,当您将实体设置为EntityState.Modified并且实际上您必须修改集合以使关系保持不变时,不会考虑关系。我正在使用以下代码将task.Timeframes集合更新为附加的Timeframes,我认为它可以工作

public void SaveTask(Task task)
{
    entities.Tasks.Attach(task);
    var timeframes = new List<Timeframe>();
    foreach (var tf in task.Timeframes)
    {
        entities.Timeframes.Attach(tf);
        timeframes.Add(tf);
    }
    entities.Entry(task).State = EntityState.Modified;
    task.Timeframes.Clear();
    timeframes.ForEach(t =>
    {
        task.Timeframes.Add(t);
    });
    entities.ChangeTracker.DetectChanges();

    entities.SaveChanges();
}

但我的关系仍然没有坚持下去。我找了一个RelationshipManager,通过它我可以手动设置添加的关系,但如果它存在于EF6中我无法弄清楚如何到达它。我做错了什么让我的关系不再存在?

1 个答案:

答案 0 :(得分:0)

通过进一步的研究和this answer,我能够添加using System.Data.Entity.Infrastructure;并将我的持久性代码更改为

public void SaveTask(Task task)
{
    entities.Tasks.Attach(task);                
    var objectContext = ((IObjectContextAdapter)entities).ObjectContext;
    foreach (var tf in task.Timeframes)
    {
         entities.Timeframes.Attach(tf);
         objectContext.ObjectStateManager.ChangeRelationshipState(task, tf, t => t.Timeframes, EntityState.Added);
    }
}

我的关系终于坚持了下来。我没想到必须手动管理这个,但希望这会帮助处于相同情况的其他人。