Ef7一对多关系HasOne WithMany和Attatch

时间:2016-06-02 14:32:17

标签: c# entity-framework

我有以下情况

我正在尝试使用dbase中的现有地址来保存雇主。我已经保存并存储了地址。我只想用一个链接地址来保存雇主。

我认为附加会很好,这似乎可以正常工作,当我有一个新的地址'我想保存。但是,一旦我尝试将雇主与现有地址联系起来,就会出现问题。

保存好的东西 - 保存雇主和地址的相关链接。但是在下一次传递(保存)时,链接被破坏(新记录采用链接)。

我参加EF7 RC1决赛。

    public class ApplicationDbContext : DbContext
{
    public virtual DbSet<Employers> Employers{ get; set; }
    public virtual DbSet<Address> Addresses { get; set; }
    }

public class Employer
{
    public int Id { get; set; }
    public string Title { get; set; }
    public virtual Address Address { get; set; }  
}

for (int i = 0; i < 10; i++)
            {
                Employer item = new Employer();                  
                // 2 address seeds - so toggle between them
                if(i % 2 == 0)
                {
                    item.Address = _dbContext.Addresses.Single(s => s.Postcode == "one address");                   
                }
                else
                {
                    item.Address = _dbContext.Addresses.Single(s => s.Postcode == "second address");
                }

                _dbContext.Attach(item.Address);                    
                _dbContext.Courses.Add(item);
                _dbContext.SaveChanges();                   

            }

1 个答案:

答案 0 :(得分:0)

我遇到的问题是由关系定义引起的

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  // add the relationship       
  modelBuilder.Entity<Employer>().HasOne(u => u.Address).WithOne();      
}

GitHub上 ajcvickers 的解释澄清了它

  

地址和员工之间存在一对一的关系。这意味着每个地址只能与一个员工相关联。通过循环的每次迭代都会将地址分配给新的Employee,从而导致它从前一个Employee中取消分配。我不确定您要模拟的是什么,但您可能需要一对多的关系,以便许多员工可以共享相同的地址。如果是这样,请将您的关系映射更改为:

modelBuilder.Entity<Employer>().HasOne(u => u.Address).WithMany();