0

Googleまたはstackoverflowで検索しても解決できない問題があります。

JournalLines と Accounts の 2 つのテーブルがあり、JournalLine でアカウントを参照したい (私は経済学が嫌いです) が、参照はオプションである必要があり、アカウントは JournalLine へのナビゲーション プロパティを持つべきではありません (理想的には)。

仕訳行:

public class JournalLine : Entity<int>
{
    public int? Account_Id { get; set; }
    public string Desc { get; set; }
    public decimal Credit { get; set; }
    public decimal Debit { get; set; }
    public virtual Account Account { get; set; }
}

_アカウント:

public class Account : Entity<int>
{
    public string Accid { get; set; }
    public string Desc { get; set; }
    public int VatcodeId { get; set; }
}

そしてそれぞれのマッピング:

public class JournalLineMap : EntityTypeConfiguration<JournalLine>
{
    public JournalLineMap()
    {
        HasKey(k => new { k.Id, k.Account_Id });
        Property(k => k.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        
        ToTable("attJournalLines");
        HasEntitySetName("JournalLines");
        
        HasOptional(jl => jl.Account)
            .WithMany()
            .HasForeignKey(jl => jl.Account_Id);
    }
}

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {
        ToTable("attAccounts");
        HasEntitySetName("Accounts");
    }
}

私が得ているエラーは次のようなものです:

モデルの生成中に 1 つ以上の検証エラーが検出されました:

tSystem.Data.Entity.Edm.EdmAssociationType: : 多重度は、関係 'JournalLine_Account' のロール 'JournalLine_Account_Target' の参照 > 制約と競合します。>従属ロールのプロパティはすべて null 非許容であるため、プリンシパル ロールの多重度は '1' でなければなりません。

これは私を混乱させます。誰かが問題に光を当ててくれることを願っています。

アップデート

途中で助けてくれた答えに感謝し、キーを削除することで仕事との関係を築きました。次に、重複Accountしたアカウントに割り当てると、奇妙な動作が作成されました。JournalLine結局のところ、依存性注入でリポジトリパターンを使用しているため、これはそれほど奇妙な動作ではありません。私が考えていなかったのは、コンテキストが両方のリポジトリで同じではなかったため、JournalLinesRepository は独自のリポジトリからフェッチしたアカウントを追跡していなかったため、それを新しいエンティティとして挿入するのが賢明だと考えたことです。これは、アイテムの追跡が期待どおりに機能するように、リポジトリに同じコンテキストを挿入することで解決されました。再びあなたの助けに感謝します。

4

2 に答える 2

3

コードを見ると、null可能であり、通常はキーとして受け入れられないHasKey(k => new { k.Id, k.Account_Id });ため、問題を引き起こしている可能性があるように「感じます」 。Account_Id何が起こるかを確認するためだけに、Account_Id の nullable フラグを削除してみてください。

編集:EFのキー

キーは常にその組み合わせで一意である必要があります (複数の列とキーがある場合)。これが、キー パラメーターに null 値を許可できない理由の背後にある基本的な規則です。

Account_Id をさらに下の外部キーとして指定すると、すでに Account_Id のキーが追加されているのに、なぜそれを主キーとしても使用する必要があるのでしょうか? 特にnullを許可してからですか?

于 2013-08-27T13:34:43.897 に答える