实体框架一个可选的外键代码第一个流畅的映射

时间:2014-04-16 14:49:26

标签: 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; } 
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。任何人都可以发现我错过的东西吗?感谢。

1 个答案:

答案 0 :(得分:4)

在EF中映射1..0或1关系时,依赖关系应该使其主键成为主体的外键。

在您的情况下,这意味着您的Access实体应放弃AccessId主键,并将UserId作为您的密钥。

如果您无法更改您的架构以允许此操作,那么解决方法的最佳选择就是将关系设置为1..many并在代码中捏造它。

相关问题