名称不匹配时的实体框架代码优先映射

时间:2016-02-19 23:02:31

标签: .net entity-framework ef-code-first entity-framework-6 .net-4.5

假设我有两个看起来像这样的实体:

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的员工数据?

我可以使用迁移或注释解决方案。

1 个答案:

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