【问题标题】:ef code first many to many saving just relationship for existing itemsef 代码首先是多对多,仅保存现有项目的关系
【发布时间】:2014-06-21 20:45:12
【问题描述】:

我首先使用 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();
}

但我的关系仍然没有持续下去。我寻找了一个关系管理器,通过它我可以手动设置要添加的关系,但如果它存在于 EF6 中,我不知道如何获取它。我做错了什么让我的关系无法持久?

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    通过进一步研究和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);
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2019-02-27
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多