具有自动更新/插入语义的1:1关系(Fluent API)

时间:2019-04-01 18:12:43

标签: c# entity-framework-6 foreign-keys entity-relationship ef-fluent-api

我有很多方法可以实现这一点,但是我很好奇是否可以使用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; }
}

这是原始的实现,但是有两个问题。

  1. (在此模型中)这应该是1:1的关系。它在代码中以这种方式工作,因为PhoneNumber不会公开ICollection<Person>,但是仍然不如我希望的那样明确。
  2. 最重要的是,当前代码正在创建孤立对象。

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:

  1. Person_IdPerson之间要1:1,其中PhoneNumber是可选的,而Person.PhoneNumber不是(已经知道如何做到这一点)。
  2. 想要和分配来充当更新。如果我分配新的PhoneNumber.Person,我想让EF认识到这实际上只是一个更新,因为PhoneNumber对于PhoneNumber始终是唯一的。

这可行吗?

0 个答案:

没有答案