Entity Framework 名称不匹配时的代码优先映射
Entity Framework Code First Mapping when Name Does Not Match
假设我有两个如下所示的实体:
public class Widget
{
public int WidgetId {get; set;}
public int CreatedBy {get; set;}
public Employee CreatedByEmployee {get; set;}
}
public class Employee
{
public int EmployeeId {get; set;}
public String EmployeeName {get; set;}
}
如何设置关系,以便 Widgets.Include(x=>x.CreatedByEmployee)
获取存储在 Widget.CreatedBy
中的 EmployeeId
的员工数据?
我对迁移或注释解决方案都满意。
使用数据注释配置一对一关系的常用方法是:
public class Widget
{
[Key,ForeignKey("CreatedByEmployee")]
public int CreatedBy {get; set;}
public virtual Employee CreatedByEmployee {get; set;}
}
public class Employee
{
[Key]
public int EmployeeId {get; set;}
public String EmployeeName {get; set;}
}
此外,如果您想使用延迟加载,请考虑将 virtual
关键字添加到您的导航属性中。在此 msdn 页面中,您将找到所有要求。
在您的情况下,您正在配置单向关系,如果您更喜欢使用 Fluent Api,例如,重写上下文的 OnModelCreating
方法,您的配置将是:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Widget>().HasKey(w=>w.CreatedBy);
modelBuilder.Entity<Widget>().HasRequired(e => e.CreatedByEmployee ).WithOptional();
base.OnModelCreating(modelBuilder);
}
在这种情况下,您不需要指定 CreatedBy
也是 FK,因为 EF 要求
依赖的主键也用作外键。
假设我有两个如下所示的实体:
public class Widget
{
public int WidgetId {get; set;}
public int CreatedBy {get; set;}
public Employee CreatedByEmployee {get; set;}
}
public class Employee
{
public int EmployeeId {get; set;}
public String EmployeeName {get; set;}
}
如何设置关系,以便 Widgets.Include(x=>x.CreatedByEmployee)
获取存储在 Widget.CreatedBy
中的 EmployeeId
的员工数据?
我对迁移或注释解决方案都满意。
使用数据注释配置一对一关系的常用方法是:
public class Widget
{
[Key,ForeignKey("CreatedByEmployee")]
public int CreatedBy {get; set;}
public virtual Employee CreatedByEmployee {get; set;}
}
public class Employee
{
[Key]
public int EmployeeId {get; set;}
public String EmployeeName {get; set;}
}
此外,如果您想使用延迟加载,请考虑将 virtual
关键字添加到您的导航属性中。在此 msdn 页面中,您将找到所有要求。
在您的情况下,您正在配置单向关系,如果您更喜欢使用 Fluent Api,例如,重写上下文的 OnModelCreating
方法,您的配置将是:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Widget>().HasKey(w=>w.CreatedBy);
modelBuilder.Entity<Widget>().HasRequired(e => e.CreatedByEmployee ).WithOptional();
base.OnModelCreating(modelBuilder);
}
在这种情况下,您不需要指定 CreatedBy
也是 FK,因为 EF 要求
依赖的主键也用作外键。