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
和基类之间的关系。