【发布时间】:2013-03-01 08:48:50
【问题描述】:
我还没有找到解决这个问题的好方法(类似的票在这里EF5 update disconnected graph (n-tier) one-to-many)。
我找到并遵循了这个例子:http://entityframeworktutorial.net/update-many-to-many-entities-in-entity-framework.aspx#.UTBeTDBhif8。
这工作得很好,但它创建了相关实体的副本(使用 sql profiler 我看到了 Insert into RelatedEntities .. 我希望只是在 MyEntities_Related 连接表上插入/更新,我不明白为什么 EF在 RelatedEntities 表上插入:(
这是我的代码:
public void AddOrUpdate(MyEntity entity) {
var dbEntity = _context.MyEntities
.Include(e => e.RelatedEntitis)
.Where(e => e.ID == entity.ID)
.SingleOrDefault();
var newRelated = entity.RelatedEntitis.ToList<RelatedEntity>();
var dbRelated = dbEntity.RelatedEntity.ToList<RelatedEntity>();
_context.Entry(dbEntity).CurrentValues.SetValues(entity);
var comparer = new EqualityComparer();
var addedRelated = newRelated.Except(dbRelated, comparer).ToList<RelatedEntity>();
var deletedRelated = dbRelated.Except(newRelated, comparer).ToList<RelatedEntity>();
addedRelated.ForEach(e => dbEntity.RelatedEntity.Add(e));
deletedRelated.ForEach(e => dbEntity.RelatedEntity.Remove(e));
}
public class EqualityComparer : IEqualityComparer<RelatedEntity>
{
public int GetHashCode(RelatedEntity obj)
{
return (obj == null) ? 0 : obj.ID.GetHashCode();
}
public bool Equals(RelatedEntity x, RelatedEntity y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
return x.ID == y.ID;
}
}
db 架构如下:
|------------------|
| Table MyEntities |
|------------------|
| int ID //PK |
|------------------|
|--------------------------|
| Table MyEntities_Related |
|--------------------------|
| int MyEntityID |
| int RelatedID |
|--------------------------|
|-----------------------|
| Table RelatedEntities |
|-----------------------|
| int RelatedID //PK |
| string Name |
|-----------------------|
任何帮助表示赞赏:)
【问题讨论】:
-
可能我不明白 .. 我要更新的实体是分离的并且是相关的,所以 EF 无法理解我的相关实体已经存在并将它们插入两次。如果我加载相关似乎按预期工作。我会尽快复制粘贴我的解决方案,确保它正常工作。
标签: c# ef-code-first many-to-many entity-framework-5