实体框架:正在尝试查询具有外键关系的实体
本文关键字:实体 关系 框架 查询 | 更新日期: 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属性时自动创建。