2014-01-31 40 views
0

我有這樣的模式:EF代碼首先執行兩個類不具有相同的外鍵實例

public class A 
{ 
     public int Id{get;set;} 
     public string Name{get;set;}  
} 

public class B 
{ 
     public int Id{get;set;} 
     public string Name{get;set;} 
     public virtual A Instance{get;set;} 
} 

public class C 
{ 
     public int Id{get;set;} 
     public string Name{get;set;} 
     public virtual A Instance{get;set;}  
} 

我想,例如,如果我有一個名爲「MYINSTANCE」實例的只有一個B或C類可以引用它,如果別人試圖引用「MyInstance」,代碼將拋出異常。 如何配置它?

回答

1

這樣的約束無法在EF中定義。您需要在您的代碼中強制執行約束。

一種可能的解決方案:

public class A { 
    private B _referenceB; 
    private C _referenceC; 

    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual B ReferenceB { 
     get { return _referenceB; } 
     set { 
       if (this.ReferenceC != null) { 
        throw new InvalidOperationException(); 
       } 
       _referenceB = value; 
      } 
     } 

    public virtual C ReferenceC { 
     get { return _referenceC; } 
     set { 
       if (this.ReferenceB != null) { 
        throw new InvalidOperationException(); 
       } 
       _referenceC = value; 
      } 
     } 
    } 
} 

替代解決方案:

public class ReferenceBase { } 
public class B : ReferenceBase { ... } 
public class C : ReferenceBase { ... } 
public class A { 
    public virtual ReferenceBase Reference { get; set; } 
    //implement a custom setter if you want to throw exception 
} 
+0

這是一個解決方案,但如果我有不只是B和C,如果我有10類,可以引用它是一個位問題沒有? –

+0

是的,更多的課程變得不切實際。另一種解決方案是從相同的基類派生'B'和'C'並定義'A'和基類之間的關係。 –