1

Entity Framework 5 への更新が必要なプロジェクトに取り組んでいます。これには、データ層を最新のものにするために、エンティティ クラスと構成クラス (最初にコード) に若干の変更が必要です。残りの 1 つのエンティティを除いて、アップグレードは完了しました。このエンティティに対してクエリを実行すると、次のエラーが発生します。

System.InvalidOperationException: A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.

エンティティは、データベース内の別のテーブルに関連する 2 つのオプションの外部キーを含むテーブルをモデル化します。

データベース内のテーブルの外観の一部を次に示します (まず、問題のテーブル)。

LocationMap                  Location
-----------                  --------
Id (PK, not null)            Id (PK, not null)
SourceId (FK, null)          ...
TargetId (FK, null)

このモデルでは、LocationMap.SourceId と LocationMap.TargetId の両方が Location.Id を参照します。データ層でこの関係を表すために使用されるエンティティ クラスと構成クラスの一部を次に示します。

public class LocationMap
{
    public int Id { get; set; }
    public int SourceId { get; set; }
    public int TargetId { get; set; }
    ...

    public virtual Location Source { get; set; }
    public virtual Location Target { get; set; }
}

public class Location
{
    public int Id { get; set; }
    ...

    public virtual ICollection<LocationMap> TargetMaps { get; set; }
    public virtual ICollection<LocationMap> SourceMaps { get; set; }
}

public LocationMapConfiguration()
{
    HasKey(x => x.Id);

    HasRequired(map => map.Source)
        .WithMany(location => location.SourceMaps)
        .HasForeignKey(map => map.SourceId)
        .WillCascadeOnDelete(false);

    HasRequired(map => map.Target)
        .WithMany(location => location.TargetMaps)
        .HasForeignKey(map => map.TargetId)
        .WillCascadeOnDelete(false);
}

public LocationConfiguration()
{
    HasKey(x => x.Id);
    ...
}

次のコードを実行すると...

using (var context = new MyDbContext())
{
    var map = context.LocationMaps
                     .FirstOrDefault();

    Logger.Info("Source name: {0}", map.Source.Name);
    Logger.Info("Target name: {0}", map.Target.Name);
}

... map.Source.Name は機能しますが、map.Target.Name は上記の例外を生成します。2 つのマッピングがどのように呼び出されるかは問題ではありません。ソースは常に機能し、ターゲットは常に例外をスローします。

元の Location エンティティ クラスには、ICollection ナビゲーション プロパティが定義されていませんでした。実際、更新されたデータ レイヤーを作成するときにこれを設定しました。複数のソース (ここにいくつかを含む) が、例に示されている方法でナビゲーション プロパティを実装するソリューションに関与していたのは、例外の調査を行っていたときでした。したがって、それらを追加しましたが、問題は解決していません。

いつものように、これに関する助けをいただければ幸いです。

ありがとう!

4

0 に答える 0