【发布时间】:2012-10-02 15:38:13
【问题描述】:
我正在尝试建立双向的一对一关系。但是,我无法获得两个实体的双向设置。
例如,假设一个人有一个电话号码,而一个电话号码只能与一个人关联。我会:
public class Person : Entity
{
public long PersonId { get; set; }
public virtual PhoneNumber PhoneNumber {get; set; }
}
public class PhoneNumber : Entity
{
public long PhoneNumberId { get; set; }
}
但是,通过这种重新安排,我无法获得双向设置。即我不能拥有phoneNumber.Person.
我尝试过的:
public class PhoneNumber : Entity
{
public long PhoneNumberId { get; set; }
[InverseProperty("PersonId")]
public virtual Person Person {get; set; }
}
当我执行以下代码时,这似乎不起作用:
var realNumber = new PhoneNumber();
var person = new Person() {PhoneNumber = realNumber};
context.SaveChanges();
这里,PhoneNumber 实体有一列 Person(设置为 NULL),而 person 有一列 PhoneNumber(有值)。
【问题讨论】:
-
EF 要求两个实体以 1:1 的比例共享相同的主键,因此您应该将它们命名为相同(出于约定目的)。
-
@MystereMan 这实际上只是在 EF 中获得 1:1 的两种方法之一。 stackoverflow.com/a/10837964/176877
-
@ChrisMoschini - 嗯?这两种方法都有一个共享的主键。我不明白你的意思,也和我说的不矛盾。
-
@MystereMan 我认为共享 PK 意味着他们的实体映射中的键必须具有相同的属性(他们没有)。没有这个,您可以一对一地设置 2 个班级。但是,在该设置中,它们确实共享数据库中的主键值,所以如果这就是您的意思,那么您是正确的。
-
@ChrisMoschini - 不,我说过它们应该被命名为约定的目的,但如果你更喜欢配置而不是约定,那么你可以命名任何东西。
标签: c# asp.net-mvc-3 entity-framework one-to-one