更新父项时,在子项中插入记录

时间:2015-02-10 21:19:51

标签: c# .net entity-framework entity-framework-6

当我更新对象Employee时,使用以下代码在Language表格中添加了一条新记录,我不明白为什么。 LanguageId有一个值,我设置Language(请参阅代码中的信息)。 Employee记录更新为新创建的LanguageId

我做错了什么?

public class Employee
{
    public virtual int EmployeeId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public virtual int LanguageId { get; set; }
    public virtual Language Language { get; set; }
}

public class Language
{
    public virtual int LanguageId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Code { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
    .HasRequired(t => t.Language); 
}

private void Update(Employee employee)
{
    //LanguageId in employee object has a value, OK
    //Language is null
    employee.Login = employee.Login.ToUpper();
    employee.Language = myRepository.Get(employee.LanguageId);

    myRepository.Update(employee);
}

2 个答案:

答案 0 :(得分:1)

我想与您分享一些提示。如果要使用FK配置一对一关系,实体框架要求从属端的主键也是外键,但我认为这不是您的情况,因为可以关联一个Language多个Employee,因此您需要配置一对多关系。您的关系配置如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Employee>().HasRequired(t => t.Language).
                                   WithMany().HasForeignKey(e=> e.LanguageId);
}

如果您想更新Language中的Employee,您有两种选择:

  • 设置FK属性LanguageId
  • 设置导航属性Language

如果您已将LanguageId设置为数据库中已存在的Language的ID,则无需找到Language并设置Language Employee实例中的属性。设置FK属性足以使EF进行更改。

答案 1 :(得分:0)

你的代码错误。

public class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int LanguageId { get; set; }
    [ForeignKey("LanguageId")]
    public virtual Language Language { get; set; }
}
public class Language
{
    public int LanguageId { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
}

如果emplyee.LanguageId具有值,则EF自动绑定语言对象。

如果您想在没有语言属性的情况下保存Employee,那么您必须在OnModelCreating和Employee类中将其设置为可选:

public int? LanguageId {get; set;}