我首先使用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中我无法弄清楚如何到达它。我做错了什么让我的关系不再存在?
答案 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);
}
}
我的关系终于坚持了下来。我没想到必须手动管理这个,但希望这会帮助处于相同情况的其他人。