我有3个模型,其中的字段如下:

public class RootObject
{
    [Key]
    public int RootObjectId { get; set; }
    [ForeignKey("RootObjectId")]
    public virtual AObject AObject { get; set; }
    [ForeignKey("RootObjectId")]
    public virtual BObject BObject { get; set; }

    public string Name { get; set; }
}

public class AObject
{
    [Key]
    public int AObjectId { get; set; }

    //Other fields
}

public class BObject
{
    [Key]
    public int BObjectId { get; set; }

    //Other fields
}

我希望这样,如果我目视检查RootObject表,我将看到RootObjectIdName的列表。为了方便起见,让我们假设偶数的RootObjectId映射到AObjectId,而几率映射到BObjectId。如果我目视检查AObject,我将期望看到ID的2、4、6。。。这是FK用于RootObject。如果是目测检查,我会看到身份证的1,3,5。。。这是FK用于BObject
目前,当我尝试此方法时,会出现以下错误:
“更新条目时出错…引用完整性约束冲突。依赖角色有多个具有不同值的主体。”
我试图删除RootObject中的FK属性,但这在RootObject中创建了另外两个用ID号填充的列。我不想这样,因为每个RootObject都有一个RootObject或一个AObject。不可能两者都有。

最佳答案

对我来说,您正在寻找实体框架中的TPT(每类型表)方法可以作为解决方案的东西。适用于你的案例(有很多方法,但我测试过了,而且有效):

public class RootObject
{
    [Key]
    public int RootObjectId { get; set; }
    public string Name { get; set; }
}

[Table("AObjects")]
public class AObject : RootObject
{
    //Other fields
    public string AField { get; set; }
}

[Table("BObjects")]
public class BObject : RootObject
{
    //Other fields
    public string BField { get; set; }
}

对于DbContext类:
public DbSet<RootObject> RootObjects { get; set; }
public DbSet<AObject> AObjects { get; set; }
public DbSet<BObject> BObjects { get; set; }

种子示例:
AObject a1 = new AObject() { Name = "ImA", AField = "adata" };
BObject b1 = new BObject() { Name = "ImB", BField = "bdata" };
context.AObjects.Add(a1);
context.BObjects.Add(b1);
context.SaveChanges();

10-08 19:04