Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架1到可选外键代码的优先映射_C#_Ef Code First_Mapping_Entity Framework 6 - Fatal编程技术网

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。。。(具体的例子:一个人和一辆车都可以有一张照片。一张照片应该与一辆车或一个人有关,但决不能两者都有。一张照片同时缺少一辆车和一个人是一种“不在乎”的情况,我们不需要它,但如果有必要,我们可以处理它)。