当我更新对象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);
}
答案 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
,您有两种选择:
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;}