2017-08-29 13 views
0

私はファイアバードデータベースの上に構築された既存のプログラム用のインターフェイスを構築しています。私はfirebird用のデータプロバイダを使用していくつかのモデルを生成しましたが、私はプログラムを壊すことなく変更することができない奇妙な構造を持ついくつかのテーブルの関係を定義しようとしています。MVC Entity Framework - 1つのフィールド内の複数のテーブルからの外部キー

これは、現在の構造を煮詰めている:

public partial class JOBLINE 
{ 
    [Key, Column(Order = 0)] 
    public int JobNumber {get;set;} 
    [Key, Column(Order = 1)] 
    public int LineNumber {get;set;} 
    public string LineType {get;set;} // can be either 'Item Code' or 'Descriptor Code' 
    public string LineCode {get;set;} 
} 

public partial class ITEMMASTER 
{ 
    [Key] 
    public string ItemCode {get;set;} 
    // The other properties 
} 

public partial class DESCRIPTORMASTER 
{ 
    [Key] 
    public string DescriptorCode {get;set;} 
    // The other properties 
} 

とても迷惑なことjoblineテーブルで、LineCodeフィールドは何CodeType分野に応じて、ItemMasterまたはDescriptorMasterのいずれかの外部キーを含めることができるということです含まれています。

これを指定する簡単な方法はありますか?流暢なAPIまたはデータ注釈を使用する。私はItemMasterDescriptorMasterのテーブルのリストのアクセサを持つように願ってい

答えて

1

とても迷惑なことjoblineテーブルで、回線コードフィールド はどちらかItemMasterのための外部キーが含まれている、または DescriptorMasterに応じことができるということですCodeTypeフィールドに含まれるもの

あなたのデータベース(Firebird)はそのようなことを許可していますか?

リレーショナル・コンセプトを使用するデータベースでは、外部キー列に異なる表の値を含めることはできません。外部キーは、2つのテーブル間の関係をこれ以上作成するのではありません。

状況によっては、LineTypeLineCodeという2つの列を結合するユニーク制約を作成することしかできません。

だから、以下のような属性Indexデータアノテーションを使用することができます。

public partial class JOBLINE 
{ 
    [Key, Column(Order = 0)] 
    public int JobNumber {get;set;} 
    [Key, Column(Order = 1)] 
    public int LineNumber {get;set;} 

    [Index("IX_LineTypeAndLineCode", 1, IsUnique = true)] 
    public string LineType {get;set;} 

    [Index("IX_LineTypeAndLineCode", 2, IsUnique = true)] 
    public string LineCode {get;set;} 
} 

するか、以下のように流暢な設定を使用します。ユニーク制約で

modelBuilder.Entity<JOBLINE>() 
    .Property(p => p.LineType) 
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_LineTypeAndLineCode") { IsUnique = true, Order = 1 })); 

modelBuilder.Entity<JOBLINE>() 
    .Property(p => p.LineCode) 
    .HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("IX_LineTypeAndLineCode") { IsUnique = true, Order = 2 })); 

はあなたがすることを確認してくださいJOBLINEテーブル内のforeachの各LineTypeLineCodeには一意の値があります。

+0

ありがとうございました。関係の指定はどのように扱いますか? –

+0

relashionshipを追加する必要はありません。unique制約は、結合された列に挿入されるデータについてのガードと考えてください。私が答えて言ったように、あなたは共有列で行う必要があるように、3つのテーブルの間にrelashionshipを作成することはできません。それは不可能だ。 – CodeNotFound

+0

Dang。ああ、助けてくれてありがとう –

関連する問題