3

この問題に対する適切な解決策はまだ見つかりませんでした(ここでの同様のチケットEF5更新切断グラフ(n層)1対多)。

私はこの例を見つけてそれに従いました:http://entityframeworktutorial.net/update-many-to-many-entities-in-entity-framework.aspx#.UTBeTDBhif8

これは問題なく機能しますが、関連するエンティティの複製が作成されます(SQLプロファイラーを使用して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           | 
|-----------------------|

どんな助けでもありがたいです:)

4

1 に答える 1

3

解決 策 それが最善かどうかはわかりませんが、私にとってはうまくいき、理にかなっていると思います。関連エンティティが分離されているため、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));
}
于 2013-03-01T14:18:45.990 に答える