.net 名称不匹配时的实体框架代码第一次映射

.net 名称不匹配时的实体框架代码第一次映射,.net,entity-framework,ef-code-first,entity-framework-6,.net-4.5,.net,Entity Framework,Ef Code First,Entity Framework 6,.net 4.5,假设有两个实体如下所示: 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 E

假设有两个实体如下所示:

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.createdbyeemployee)
将获取存储在
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;}
}

也可以考虑如果您想使用惰性加载,则将“<代码>虚拟< /Cord>”关键字添加到导航属性中。在本页中,您将找到所有要求

在您正在配置单向关系的情况下,如果您更喜欢使用Fluent Api,例如,覆盖上下文的model creating方法,您的配置将是:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Widget>().HasKey(w=>w.CreatedBy);
        modelBuilder.Entity<Widget>().HasRequired(e => e.CreatedByEmployee ).WithOptional();
        base.OnModelCreating(modelBuilder);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasKey(w=>w.CreatedBy);
modelBuilder.Entity().HasRequired(e=>e.CreatedByEmployee).WithOptional();
基于模型创建(modelBuilder);
}
在这种情况下,您不需要指定
CreatedBy
也是FK,因为
依赖项的主键也用作外键。

Perfect!非常感谢你!我更新了我的示例以更好地展示我的真实场景。
Widget
有自己的
WidgetId
。在这种情况下,对于我的第二个解决方案,EF不允许您将
CreatedBy
属性映射为FK,因为您正在显式地配置一对一,但是我的第一个模型使用<代码> FutuxKy//Cuth>属性在这个属性上起作用,但是你必须考虑到EF将创建一对多的关系,而不是一对一的关系,这是因为我在回答的末尾解释了限制。