我正在使用 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)
答案 0 :(得分:0)
EF无法猜到这一点。您始终可以手动为保险公司设置密钥:
Insurer insurer = new Insurer()
{
PartyId = 1,
RoleTypeId = 1
};
...
testContext.SaveChanges();