.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将创建一对多的关系,而不是一对一的关系,这是因为我在回答的末尾解释了限制。