2017-11-29 7 views
0

を定義する方法を私は、既存のデータベーススキーマを持っている、と私は外国を使用してリンクテーブルを追加するASP.NETコアとEntity FrameworkのEntity Frameworkのコード - カスタムナビゲーションプロパティ

を使用していますただし、外部キー索引列は、標準のEF規則に準拠するものではありません。これをEFでどのように表現できますか?可能であればData Annotation属性を使用することをお勧めしますが、そうでない場合はModelBuilderの流暢なAPIを使用するのは問題ありません。

は、本質的に、この上記モデルで

[Table("widgets")] 
class Widget { 
    [Key, Column("id")] 
    int Id { get; set; } 

    [Column("referencenumber")] 
    int ReferenceNumber { get; set; } 

    public WidgetReferenceData ReferenceData // ???? How do I express this? 
} 

[Table("widgetreferences")] 
class WidgetReference { 
    [Key, Column("referencenumber")] 
    int ReferenceNumber { get; set; } 

    [Column("value")]  
    string Value { get;set; } 
} 

WidgetWidgetReferenceテーブルに0または1関連するエントリを有していてもよく、widgets.referencenumberデータベースカラムを使用してリンク。

私がしたいのは、関連するWidgetReference(存在しない場合はnull)をロードするために、ウィジェットモデルにプロパティを追加することです。基本的に私はこのようにそれを使用することができるようにしたい:

var referenceValue = FindWidget().ReferenceData?.Value; 

それは、従来の「ID」列だったら、私はどのように、EFはそれの世話をするだろうが、私は、カスタムデータベースの列とプロパティ名を持っているとして、この関係を表現する?

結果に影響するかどうかはわかりませんが、widgetreferences.referencenumberは外部キーではなく、インデックスを持つ列であることが重要です。私たちのビジネスロジックは、ウィジェットが削除されても参照データを保持したいと考えている場合です。

私はグーグルでこれに対する答えを見つけようとしませんでしたが、 :-(

+0

タイトルが言う、それはコードです最初に体がDBであると最初に言いましたか?あなたが足場をとった場合、スキャフォルダーはあなたの関係をどのように表していますか?(またはFKがないので気にしませんか?ウィジェットとリファレンスのx:yの関係は? –

+0

これは最初のコードです。私はedmxマッピングファイルなどを使用していません。 ウィジェットには参照が1つ(referencecenumber列で結合)されていますが、参照は削除されるウィジェットから存続します。 –

+0

Like https://stackoverflow.com/questions/35501552/code-first-of -ef-how-to-define-navigation-property-relationship-without-settingですか?これらのことに関する一般的な合意は、EFにFKを作成させ、それをDBから削除するように思われる。私はそれが正しい方法でラウンドされている場合、あなたはそれを変更しようとすることができます "カスケード削除の種類を設定する"ので、あなたの参照は、そのwidgetidを失う(しかし、それは反対の方法に関連しているように見える、 widgetidを持つ参照ではなくreferenceidを持っている)ウィジェットがなくなる場合 –

答えて

1
[Table("widgets")] 
    class Widget 
    { 
     [Key, Column("id")] 
     int Id { get; set; } 

     [Column("referencenumber")] 
     int? ReferenceNumber { get; set; } 

     [ForeignKey("ReferenceNumber")] 
     public virtual WidgetReferenceData ReferenceData // ???? How do I express this? 
    } 

    [Table("widgetreferences")] 
    class WidgetReference 
    { 
     [Key, Column("referencenumber")] 
     int ReferenceNumber { get; set; } 

     [Column("value")]  
     string Value { get;set; } 
    } 

ただ外部キープロパティとナビゲーションプロパティを関連付けるためにForeignKeyAttributeを使用しています。実際には、バックエンドの外部キーがある場合、EFは気にしません。

+0

モデルに '[ForeignKey(" ReferenceNumber ")]'を置くかどうかに関わらず、EFはデータベースの移行を生成するWidgetReferenceとWidgetの間の明示的な外部キーです。これは私が望むものではありません。 –

+0

既存のデータベーススキーマがある場合は、移行をまったく使用しないでください。 –

+0

既存のデータベーススキーマは過去の移行を使用して生成されました...すべての既存のデータを破損することなく、ビジネス要件(セカンダリキーを使用して関連付けられたオプションの追加データ)を表現するだけです –

関連する問題