0

私は次のクラスを持っています:

public class FinanceiroLancamento
{
    /// <summary>Identificação</summary>
    public override int Id { get; set; }

    /// <summary>Financeiro caixa</summary>
    public FinanceiroLancamentoCaixa FinanceiroLancamentoCaixa { get; set; }
}

public class FinanceiroLancamentoCaixa
{
    /// <summary>Identificação</summary>
    public override int Id { get; set; }

    /// <summary>Identificação do lançamento financeiro</summary>        
    public int IdFinanceiroLancamento { get; set; }
}

移行をマップして実行しようとすると、次のように返されます。

プロパティ名 'IdFinanceiroLancamento' は既に定義されています。

この問題を解決するには、idfinanceirolancamento にコメントして、次のようにマップする必要がありました。

        HasRequired(e => e.FinanceiroLancamentoCaixa)
            .WithRequiredPrincipal()
            .Map(m => m.MapKey("IdFinanceiroLancamento"));

問題は、この FK (FinanceiroLancamento -> FinanceiroLancamentoCaixa) で "IdFinanceiroLancamento { get; set; }" を維持するにはどうすればよいかということです。

これは私の場合、クラスの後半で使用するために非常に重要です。

Ps: FinanceiroLancamento には FinanceiroLancamentoCaixa は必要ありませんが、FinanceiroLancamentoCaixa が存在する場合は FinanceiroLancamento が必要です。

よろしくお願いします。

ウィルトン・ラファト・ウォンラス

4

1 に答える 1

0

Entity Framework では、1 対 1 のマッピングで同じ主キーを共有する必要があります。あなたの場合、別のメンバーをマッピング ID として使用しようとしています。また、基本クラス ID をオーバーライドせず、継承するだけです。

あなたが欲しいのはこれです:

.HasRequired(e => e.FinanceiroLancamentoCaixa)
.WithRequiredPrincipal();

Entity Framework では、共有主キーではない 1:1 を使用できないため、EF では使用できません。これが絶対に必要な場合は、ストアド プロシージャとして実行し、EF から呼び出す必要があります。

このように 1 対 1 にすることができない理由は、データ モデルにより IdFinanceiroLancamento を複数のレコードで同じ ID に設定できるため、1 対 1 が壊れてしまうからです。

基本的に、EF では、マッピングの違反を許可するマッピングを使用してモデルを作成することはできません。重複を作成しない場合でも、可能性は残ります。EF は一意の制約についても認識していないため、一意の制約を配置しても EF に問題がないことがわかりません。

この機能をご覧になりたい場合は、EF uservoice で投票することをお勧めします。

http://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/1050579-unique-constraint-ie-candidate-key-support

于 2013-04-26T14:41:47.417 に答える