【问题标题】:EF: one-to-one relationshipEF:一对一的关系
【发布时间】: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


【解决方案1】:

这对我有用

namespace Ef1to1
{
    public class TestContext : DbContext
    {

        public TestContext()
            : base("Data Source=127.0.0.1;database=Junk;Integrated Security=SSPI;")
        {

        }
        public DbSet<Person> Persons { get; set; }
        public DbSet<PhoneNumber> PhoneNumbers { get; set; }
    }
    [Table("Person")]
    public class Person 
    {
        [Key, Column("PersonId")]
        public long Id { get; set; }

        public virtual PhoneNumber phoneNumber { get; set; }
    }

    [Table("PhoneNumber")]
    public class PhoneNumber
    {

        [Key, Column("PhoneNumberId"), ForeignKey("person")]
        public long Id { get; set; }

        public virtual Person person { get; set; }
    } 

   public class Program
    {

        static void Main(string[] args)
        {
            var realNumber = new PhoneNumber();
            var person = new Person() { phoneNumber = realNumber }; 
            var context = new TestContext();

            context.Persons.Add(person) ;
            context.SaveChanges();
            ;

        }
    }
}

【讨论】:

  • hmm... 我得到一个“无法确定类型之间关联的主体端”
  • 所以PhoneNumberId 也将是Person 的外键?不确定这是否有意义,但现在会尝试...
  • 我不认为这样做。我认为将 ForeignKey Person 设置为 PhoneNumberId 会告诉 EF PhoneNumber 和 Person 的 id 应该匹配。 IE。 Person.Id = 1 应该有 PhoneNumber.Id = 1。只是一个想法......可能是错误的......
  • @Karan 经过大约 100 次编辑,我认为这应该适合你
  • 谢谢!我这里atm没有我的编码环境,我明天早上第一件事就试试看! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2021-07-21
  • 2019-07-25
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多