表格
User
------
UserId PK
Access
-------
AccessId PK
UserId FK to User.UserId
用户实体
public int Id { get; set; }
public virtual Access Access { get; set; }
访问实体
public int Id { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
访问映射
...
HasKey(t => t.Id);
Property(t => t.Id).HasColumnName("AccessId");
HasRequired(t => t.User).WithOptional(t => t.Access);
...
用户映射
...
HasKey(t => t.Id);
Property(t => t.Id).HasColumnName("UserId");
...
查询
var access = _unitOfWork.Users.Get()
.Where(u => u.Id == userId)
.Select(u => u.Access)
.FirstOrDefault();
生成SQL
LEFT OUTER JOIN [dbo].[Access] AS [Extent2]
ON [Extent1].[UserId] = [Extent2].[AccessId] <-- ** PROBLEM IS HERE **
我的查询试图加入错误的列,即使我在数据库中设置了PK / FK并且在我的实体地图上指定了PK。任何人都可以发现我错过的东西吗?感谢。
答案 0 :(得分:4)
在EF中映射1..0或1关系时,依赖关系应该使其主键成为主体的外键。
在您的情况下,这意味着您的Access
实体应放弃AccessId
主键,并将UserId
作为您的密钥。
如果您无法更改您的架构以允许此操作,那么解决方法的最佳选择就是将关系设置为1..many并在代码中捏造它。