【问题标题】:Entity Framework one to optional foreign key code first fluent mapping实体框架一到可选外键代码优先流利映射
【发布时间】:2014-04-16 14:49:25
【问题描述】:

表格

    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。谁能发现我错过了什么?谢谢。

【问题讨论】:

    标签: c# ef-code-first mapping entity-framework-6


    【解决方案1】:

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

    在您的情况下,这意味着您的 Access 实体应删除 AccessId 主键并让 UserId 成为您的键。

    如果您无法更改架构以允许这样做,您最好的解决方法是将关系设为 1..many 并在您的代码中捏造它。

    【讨论】:

    • 非常感谢,我真的被困在这上面了。
    • 相同的答案是否适用于可选到可选的关系?问题是“无钥匙”实体应该有两个单独的可选到可选关系,所以“无钥匙”实体不能使用主体的 PK 作为自己的 PK...(具体示例:Person 和汽车可以可选地有图片。图片应该与汽车或人相关,但绝不会同时与两者相关。同时缺少汽车和人的图片是“无关紧要”情况下,我们不需要它,但如果需要,我们可以处理它)。
    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多