C# 实体框架1到可选外键代码的优先映射
表格C# 实体框架1到可选外键代码的优先映射,c#,ef-code-first,mapping,entity-framework-6,C#,Ef Code First,Mapping,Entity Framework 6,表格 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;
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; }
访问实体
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");
...
用户映射
...
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 **
左外部联接[dbo].[Access]作为[Extent2]
在[Extent1].[UserId]=[Extent2].[AccessId]上,在EF中映射1..0或1关系时,依赖关系的主键应为主体的外键
在您的情况下,这意味着您的Access
实体应该删除AccessId
主键,并将UserId
作为您的键
如果您无法更改模式以允许此操作,那么解决方法的最佳选择将是将关系设置为1..many并在代码中捏造它。在EF中映射1..0或1关系时,依赖关系的主键应为主体的外键
在您的情况下,这意味着您的Access
实体应该删除AccessId
主键,并将UserId
作为您的键
如果您无法更改模式以允许此操作,那么解决方法的最佳选择将是将关系设置为1..many并在代码中捏造它。非常感谢,我真的被困在这一点上。相同的答案是否适用于可选关系?问题是“无键”实体应该有两个独立的可选到可选关系,因此“无键”实体不能使用主体的PK作为自己的PK。。。(具体例子:一个人和一辆车都可以有一张照片。一张照片应该与一辆车或一个人有关,但决不能两者都有。一张照片同时缺少一辆车和一个人是一种“不在乎”的情况,我们不需要它,但我们可以在必要时处理它).非常感谢你,我真的被困在这个问题上了。同样的答案是否适用于可选关系?问题是“无键”实体应该有两个独立的可选到可选关系,因此“无键”实体不能使用主体的PK作为自己的PK。。。(具体的例子:一个人和一辆车都可以有一张照片。一张照片应该与一辆车或一个人有关,但决不能两者都有。一张照片同时缺少一辆车和一个人是一种“不在乎”的情况,我们不需要它,但如果有必要,我们可以处理它)。