【问题标题】:EF5 Many To Many update disconnected scenarioEF5 多对多更新断开连接的场景
【发布时间】: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


【解决方案1】:

解决方案 我不知道它是否是最好的,但它对我有用,我认为它很有意义。 EF 创建相关实体的副本,因为它们已分离, 我以这种方式更改了我的代码:

public void AddOrUpdate(MyEntity entity) {
    var dbEntity = _context.MyEntities
      .Include(e => e.RelatedEntitis)
      .Where(e => e.ID == entity.ID)
      .SingleOrDefault();

    //replace entities with those taken from the context
    var relatedEntities = _context.RelatedEntities;
    var detachedEntities = entity.RelatedEntities;
    entity.RelatedEntities = new List<RelatedEntity>();
    foreach (var ent in detachedEntities)
    {
      entity.RelatedEntities.Add(relatedEntities .Where(e => e.ID == hop.ID).SingleOrDefault());
    }

    var newRelated = entity.RelatedEntitis.ToList<RelatedEntity>();
    var dbRelated = dbEntity.RelatedEntity.ToList<RelatedEntity>();

    _context.Entry(dbEntity).CurrentValues.SetValues(entity);
    _context.Entry(dbEntity.RelatedEntity).CurrentValues.SetValues(entity.RelatedEntitis);

    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));
}

【讨论】:

  • _context.Entry(dbRelatedEntities).CurrentValues.SetValues(RelatedEntities);不见了。如果它添加了我会支持它。
  • 这里有一个关于如何编写通用版本goo.gl/2sCky 的类似问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2015-05-16
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多