EntityFramework代码首先手动将PK作为FK设置到其他表

时间:2015-06-19 10:36:51

标签: c# entity-framework ef-code-first

我正在使用 EntityFramework CodeFirst和现有数据库。我遇到了钥匙的一些问题。我创造了 四个测试表和模型来模拟情况:

派对 - 主要容器类

public class Party
{
    // Id is generated at database
    public int Id { get; set; }

    public virtual ICollection<PartyRole> PartyRoles { get; set; }
}

RoleType - 类型根据角色分隔某些数据。

public class RoleType
{
    // This is static library table so need to generate Id
    public short Id { get; set; }
    public string Value { get; set; }
}

PartyRole - 各方角色

public class PartyRole
{
    // PartyId and RoleTypeId is composite PK
    public int PartyId { get; set; } // Is FK to Party
    public short RoleTypeId { get; set; } // Is FK to RoleType

    public virtual Party Party { get; set; }
    public virtual RoleType RoleType { get; set; }
    public virtual ICollection<Insurer> Insurers { get; set; }
}

保险人

public class Insurer
{
    public int Id { get; set; }
    // PartyId and RoleTypeId is composite FK to PartyRole
    public int PartyId { get; set; }
    public short RoleTypeId { get; set; }

    // Other properties

    public virtual PartyRole PartyRole { get; set; }
}

为简单起见,我没有提供映射细节。映射详细信息是正确的,并使用Fluent API编写。 当我尝试手动设置PartyRole的PK并插入它时,这些值不会反映在保险公司:

using (MyTestContext testContext = new MyTestContext())
{
    Insurer insurer = new Insurer();

    PartyRole partyRole = new PartyRole()
    {
        PartyId = 1, // Party with this Id already exist
        RoleTypeId = 1, // RoleType with this id already exist
        Insurers = new List<Insurer>() { insurer }
    };

    testContext.Set<PartyRole>.Add(partyRole);
    testContext.SaveChanges();
}

当我执行上面的代码时,生成以下sql语句:

insert into "PARTY_ROLES"
            ("ID",
             "ROLE_TYPE_ID")
values      (1 /* :p0 */,
             1 /* :p1 */);

insert into "INSURERS"(
    "PARTY_ID",
     "ROLE_TYPE_ID")
values (
    0 /* :p0 */,
     0 /* :p1 */);

我的问题是为什么EF发送(0,0)插入INSURERS,它们应该是(1,1)

如果 PartyId RoleTypeId PartyRole 模型中不是 FKs ,则会发送(1, 1)

1 个答案:

答案 0 :(得分:0)

EF无法猜到这一点。您始终可以手动为保险公司设置密钥:

Insurer insurer = new Insurer()
{
    PartyId = 1,
    RoleTypeId = 1
};
...
testContext.SaveChanges();