0

Entity Framework と流暢な API を使用してバインディングを構成しています。私の2つのエンティティは次のようになります。

public class Matter
{
    #region Properties

    /// <summary>
    /// Primary key
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Navigation: the most recent Relativity activity for the Matter
    /// </summary>
    public virtual RelativityActivity RelativityRecentActivity { get; set; }

    #endregion
}

public class RelativityActivity
{
    #region Properties

    /// <summary>
    /// Primary key
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Foreign key: the Matter that the Relativity Activity entry is associated with
    /// </summary>
    public Matter Matter { get; set; }

    #endregion
}

私は既存のテーブル スキーマを使用しています。スキーマでは、RelativityActivityテーブルには単にMatterId列への外部キーがあります。したがって、Matterはリレーションのプリンシパルであり、 がなくても存在できますRelativityActivity。ただし、 はなしRelativityActivityでは存在できませんMatter

私の人生では、これが期待どおりに機能するように構成することはできないようです。私はSOに関するたくさんの回答を読み、それぞれを読んだ後に流暢なAPIバインディングを調整しましたが、「リレーションのプリンシパルエンドを判断できない」から「不適切な多重度で構成しました」までの範囲のエラーが常に発生するようです.

現在の流暢な API バインディングは次のようになります。

modelBuilder.Entity<RelativityActivity>().HasRequired(m => m.Matter).WithRequiredDependent(m => m.RelativityRecentActivity).Map(m => m.MapKey("matter")).WillCascadeOnDelete(true);

RelativityActivityおよび:

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity).WithRequired(m => m.Matter);

のためにMatter

リレーションには 2 つのバインディングがあります。バインディングがないと、Matterプリンシパル エンド エラーを特定できなかったからです。しかし今、多重度に関するエラーが発生しました。

明確にするために編集:

表の外部キー列は列RelativityActivityではありませんId。これは、実際には という名前の別の列matterです。Mapバインディングの関数を使用してこれを指定しようとしました。

4

1 に答える 1

1

db スキーマは0..1 - n関連付けのみを強制できます。アソシエーションには、相互に参照する 2 つの1:1外部キー、または同時に別の主キーに対する外部キーである主キーのいずれかが常に含まれます。

1 対 1 の関連付けを次のようにモデル化できます。

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity)
                             .WithRequired(m => m.Matter);

問題は、データベース スキーマも 1 対 1 の関連付けに対応していると EF が想定することです。

Matterおよびオブジェクトを保存するRelativityRecentActivity場合、EF はMatterレコードを挿入し、その PK 値を取得して の PK として使用しますRelativityRecentActivity(それが FK でもあると仮定します)。したがって、あなたの場合、実際の外部キー フィールドが入力されることはありません。RelativityRecentActivityそれに加えて、自動インクリメント PK (Sql Server の ID 列) がある場合、例外が発生することもあります。

したがって、関連付けを通常の1対多の関連付けとしてモデル化し、ビジネスルールを使用して「多」が1を超えないようにすることしかできないと思います。

modelBuilder.Entity<Matter>().HasMany(m => m.RelativityRecentActivity)
            .WithRequired(r => r.Matter)
            .Map(m => m.MapKey("matter");
于 2013-10-25T20:55:10.453 に答える