假设我有两个看起来像这样的实体:
println()
如何设置关系,以便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)
中存储的EmployeeId
的员工数据?
我可以使用迁移或注释解决方案。
答案 0 :(得分:2)
使用数据注释配置一对一关系的常用方法是:
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);
}
在这种情况下,由于EF的要求,您不需要指定CreatedBy
也是FK
依赖的主键也用作外键。