1

.net 3.5 と Entity Framework 3.5 も使用しています (最近のバージョンにアップグレードできません)。

EF を使用して新しいエンティティをデータベースに保存すると、状態が「変更なし」で ID > 0 の場合でも、すべてのエンティティ参照が複製されます。

コードの一部を次に示します。

public long Insert(CarDTO carDTO)
    {
        Car car = Mapper.Map<CarDTO, Car>(carDTO);
        using (var context = new Entities())
        {   
            car.Wheel =
                context
                .Wheels
                .FirstOrDefault(item => item.ID == carDTO.Wheel.ID);

            context.AddToCar(car);
            context.SaveChanges();
        }
    }

ご覧のとおり、Car 型の新しいエンティティのみを作成しますが、SaveChanges が実行されると、参照されたエンティティ Wheel のデータベースにも新しいコピーが作成されます。

なぜこれが起こっているのかを誰かが理解するのを手伝ってくれますか? 前述したように、エンティティ Wheel の状態は Unchanged であり、EntityID を持っているため、新しいエンティティであるため、データベース上で更新したり複製したりしないでください。

4

1 に答える 1

1

問題の解決策を見つけました!

何らかの理由で、マッピングは参照エンティティをマップすべきではありません。したがって、参照エンティティのデータベース レプリケーションを回避するソリューションでは、以下の例のように、この参照のマッピングを無視する必要があります。

public long Insert(CarDTO carDTO)
{
    Map map = Mapper.CreateMap<CarDTO, Car>();
    map.ForMember(dto => dto.Wheel, entity => entity.Ignore());
    Car car = Mapper.Map<CarDTO, Car>(carDTO);
    using (var context = new Entities())
    {   
        car.Wheel =
            context
            .Wheels
            .FirstOrDefault(item => item.ID == carDTO.Wheel.ID);

        context.AddToCar(car);
        context.SaveChanges();
    }
}

他の場所 (このメソッドの呼び出しの前) にマッピングを作成できないことに注意してください。そうしないと、以前の宣言の構成が使用され、ignore ステートメントがありません。

私が使用していたマッパーはこれです: https://github.com/AutoMapper/AutoMapper

于 2013-03-13T09:26:09.510 に答える