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 要求 依赖的主键也用作外键。