2017-04-03 4 views
-1

キーコンビネーションを作成するシナリオがあります。 EF 6でコードを先に実行する方法はありますか?コンポジットキー1対1と3対1エンティティフレームワーク6コードファースト

私は同じブランチで複製されないようにdeviceとemployeeに制限を加えなければなりません。 branchIdは外部キーです。

私はクラスの下に使用しようとするが、その私はブランチ= 1を追加することができ、デバイス画像の下= 2と従業員= 1

public class Employee 
{ 
    public Employee() 
    { 
     Departments = new HashSet<Department>(); 
    } 

    [Key] 
    public long EmployeeId { get; set; } 

    [ForeignKey("Branch")] 
    [Index("BranchEmpDev", IsUnique = true, Order = 1)] 
    public long BranchId { get; set; } 

    [Index("BranchEmpDev", IsUnique = true, Order = 2)] 
    public string DevRegNumber { get; set; } 

    [Index("BranchEmpDev", IsUnique = true, Order = 3)] 
    public string EmployeeNumber { get; set; } 

    public virtual Branch Branch { get; set; } 
    public virtual ICollection<Department> Departments { get; set; } 


} 

は私が必要なものを見せています。

enter image description here

+0

キーの組み合わせを作成しますか?複合キーを作成しようとしていますか? – DarthJam

+0

はい私はデバイスと従業員の制限を追加して、同じブランチに参加できないようにしなければなりません。 –

+0

バウンティを設定することで注意が喚起されますが、問題は改善されません。意味のある回答を得るには、エンティティクラスと関連する流暢な構成(EF関連の質問の最小限のもの)があれば投稿します。 –

答えて

2

私はそれを理解する方法は、現在、あなたは(BranchId, DevRegNumber, EmployeeNumber)フィールドの組み合わせに「BranchEmpDev」と呼ばれる単一の一意のインデックス(制約)を持っていますが、あなたの代わりに2つのユニークなインデックスが欲しい - (BranchId, DevRegNumber)フィールドの組み合わせの1(コールをしましょうそれは "BranchDev")と(BranchId, EmployeeNumber)フィールドコンビネーションの別のもの( "BranchEmp"と呼ぶ)。

それほど直感的ではありませんが(複合キー/インデックスは一般的にEF6では直感的ではありません)、可能です。データ注釈を使用するには、現在のモデルでIndexAttributeを使用しますが、の別名を使用し、対応するプロパティに希望の順序で適用します。つまり、BranchIdにはの2つがあります。IndexAttributes - 各インデックスに1つずつ含まれています。

ソリューションの関連部分は次のようになります。

.Index(t => new { t.BranchId, t.EmployeeNumber }, unique: true, name: "BranchDev") 
.Index(t => new { t.BranchId, t.DevRegNumber }, unique: true, name: "BranchEmp"); 

あなたが見ることができるように、EF:(ちょうど検証のための)テーブル作成、移行に以下の部分を生成

[ForeignKey("Branch")] 
[Index("BranchEmp", IsUnique = true, Order = 1)] 
[Index("BranchDev", IsUnique = true, Order = 1)] 
public long BranchId { get; set; } 

[Index("BranchEmp", IsUnique = true, Order = 2)] 
[StringLength(10)] 
public string DevRegNumber { get; set; } 

[Index("BranchDev", IsUnique = true, Order = 2)] 
[StringLength(10)] 
public string EmployeeNumber { get; set; } 

IndexAttributeという同名のに統合し、Orderを使用して複合列リストを作成します。

関連する問題