【问题标题】:Record inserted in child when update the parent更新父项时插入子项的记录
【发布时间】:2015-02-10 21:19:50
【问题描述】:

当我更新对象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);
}

【问题讨论】:

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


    【解决方案1】:

    我想与您分享一些技巧。如果您想使用 FK 配置一对一关系,Entity Framework 要求依赖端的主键也是外键,但我认为这不是您的情况,因为一个 Language 可以关联到更多不是一个Employee,所以需要配置一对多的关系。你的关系的配置是这样的:

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

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

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

    如果您已经使用 DB 中已经存在的 Language 的 ID 设置了 LanguageId,则无需在 Employee 实例中找到 Language 并设置 Language 属性。设置 FK 属性足以让 EF 进行更改。

    【讨论】:

      【解决方案2】:

      你有错误的代码。

      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;}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-19
        • 2013-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多