实体框架:正在尝试查询具有外键关系的实体

本文关键字:实体 关系 框架 查询 | 更新日期: 2023-09-27 18:24:51

型号:

public class User
{
    public int Id {get; set;}
    public int SomeProperty {get; set;}
    public virtual Group Group { get; set; }
}
public class Group {
{
    public int Id {get; set;}
    // other properties
}

运行此linq查询:

myContext.Users.Where(u => u.SomeProperty = 4);

生成以下sql查询:

select
    extent1.Id as Id
    extent1.SomeProperty as SomeProperty
    extent1.Group_Id as Group_Id
from
    dbo.Users as extent1

奇怪的是,它决定不像对待其他属性那样对关联列进行驼色处理。这有什么原因吗?

无论如何,我添加了映射代码来尝试修复它:

var entity = modelBuilder.Entity<User>();
entity.HasRequired( a => a.Group )
    .WithRequiredDependent()
    .Map( a => a.MapKey( "GroupId" ) );

不幸的是,使用linq进行查询会产生以下查询:

select
    extent1.Id as Id
    extent1.SomeProperty as SomeProperty
    extent1.GroupId as GroupId
    extent1.Group_Id as Group_Id
from
    dbo.Users as extent1

它看起来更好一些,但显然仍然不起作用,因为我的表有GroupId列,而没有Group_Id列。有人知道这里发生了什么或如何修复吗?

实体框架:正在尝试查询具有外键关系的实体

由于映射User-Group是n-1,因此映射应该是:

var entity = modelBuilder.Entity<User>();
entity.HasRequired(a => a.Group)          // user has one Group
      .WithMany()                         // Group has many Users
      .Map( a => a.MapKey("GroupId"));

EF为它从类模型中推断出的1-n关联创建了Group_Id列本身,而添加GroupId是因为您自己映射了1:1的关联。

或者您可以按照编写

public class User
{
   public int Id {get; set;}
   public int SomeProperty {get; set;}
   [ForeignKey("Group")] 
   public int GroupId {get;set;}
   public virtual Group Group { get; set; }
}

Group_Id区块在未定义foreignKey属性时自动创建。