我有很多方法可以实现这一点,但是我很好奇是否可以使用Fluent API在EF6中实现一种特定的实现。以以下两个课程为起点。
class Person
{
public long Id { get; set; }
public virtual PhoneNumber PhoneNumber { get; set; }
}
class PhoneNumber
{
public long Id { get; set; }
public string AreaCode { get; set; }
public string Digits { get; set; }
}
这是原始的实现,但是有两个问题。
PhoneNumber
不会公开ICollection<Person>
,但是仍然不如我希望的那样明确。。
void UpdatePhonenNumber(Person p, string areaCode, string digits)
{
// oops, lost the last one
p.PhoneNumber = new PhoneNumber { AreaCode = areaCode, Digits = digits };
}
我可以轻松解决1:1问题。在这个简单的示例中,我还可以检查是否为null并进行更新或创建,但是如果其他代码正在执行类似的操作怎么办?我也可以更改该代码,但我希望在DB层使用更自动的功能。
我的第一个想法是在PhoneNumber
上使用组合键,但是A)我必须为此在PhoneNumber上使用属性(例如,不能添加Person
导航道具并使用{{1 }})和B)我看不到如何自动设置Person.Id
之类的内容。更改代码以进行显式设置似乎比仅检查null更好。
我已经尝试了一些关于此想法的变体,但是我还没有找到任何方法可以使这一切在EF和DB层之间神奇地起作用。 TLDR:
Person_Id
和Person
之间要1:1,其中PhoneNumber
是可选的,而Person.PhoneNumber
不是(已经知道如何做到这一点)。PhoneNumber.Person
,我想让EF认识到这实际上只是一个更新,因为PhoneNumber
对于PhoneNumber
始终是唯一的。这可行吗?