我花了最后三个小时试图解决这个问题并最终放弃了(我会解决它)。但是......只是为了确定......在EF6 Fluent API中没有办法设置单向0:1/1:1?
考虑:
CREATE TABLE LegacyUsers (
ID INT NOT NULL PRIMARY KEY,
UserName NVARCHAR(50),
EmployeeID INT NULL
)
CREATE TABLE Employees (
ID INT NOT NULL PRIMARY KEY,
EmployeeName NVARCHAR(50)
)
域模型:
public class LegacyUser {
public int ID {get;set;}
public int? EmployeeID {get;set;}
public virtual Employee Employee {get;set;}
}
public class Employee {
public int ID {get;set;}
public string EmployeeName {get;set;}
}
“Fluent”(哈哈)API理论设置:
modelBuilder.Entity<LegacyUser>()
.HasOptional(x => x.Employee)
.WithForgeignKey(x => x.EmployeeID)
我已经研究了几个小时,并尝试了许多方法来配置它。对于我的努力,我已经获得了“列名已存在”验证错误或“无效列:Employee_ID”错误(其中我可以很容易地修复这些是双向的,但这是一个或多或少的锁定架构)。我发现它唯一会强制它起作用的是将它作为1:M关系来尝试,它通过必须使用域模型属性作为集合而不是简单的单一性来抛弃整个“流畅性”属性。
真的没有办法像我认为应该那样容易吗?要求非常简单:获取关联的员工对象,并为旧用户提供文件中的员工ID(无需修改模型或向数据库添加新字段)
(供参考):
答案 0 :(得分:2)
我发现的唯一可以强制它发挥作用的是将它作为1:M的关系来尝试,它会抛弃整个流畅的&#34;必须使用域模型属性作为集合而不是简单的单个属性。
这确实是Associations in EF Code First: Part 5 – One-to-One Foreign Key Associations中描述的设置此类关系的唯一方法。但是你误读了单向部分。幸运的是&#34; uni&#34; part是依赖端的单个导航属性 - 确切地说是外键属性存在的位置。
所以你的模型没问题,你只需要这样设置:
modelBuilder.Entity<LegacyUser>()
.HasOptional(e => e.Employee)
.WithMany()
.HasForeignKey(e => e.EmployeeID)
.WillCascadeOnDelete(false);
关键部分是无参数WithMany
调用。