C# EF代码首先强制两个类不具有相同的外键实例

C# EF代码首先强制两个类不具有相同的外键实例,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有这个模型: 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 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”的实例A,那么只有一个B或C类可以引用它,如果其他人试图引用“MyInstance”,代码将抛出异常。
如何配置它?

在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
}
替代解决方案:

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
}

这是一个解决方案,但如果我不仅仅有B和C,如果我有10个类可以引用a,这是一个小问题不是吗?是的,有更多的类,它变得不切实际。另一种解决方案是从同一基类派生
B
C
,并定义
a
和基类之间的关系。