C# 实体框架-从查询动态设置模型属性值
我有以下型号:C# 实体框架-从查询动态设置模型属性值,c#,entity-framework,automapper,code-first,C#,Entity Framework,Automapper,Code First,我有以下型号: public class A_DTO { [Key] public string Id { get; set; } **public virtual B_DTO B { get; set; }** public virtual List<B_DTO> Bs { get; set; } } public class B_DTO { [Key] public string Id { get; set; } pu
public class A_DTO
{
[Key]
public string Id { get; set; }
**public virtual B_DTO B { get; set; }**
public virtual List<B_DTO> Bs { get; set; }
}
public class B_DTO
{
[Key]
public string Id { get; set; }
public string AId { get; set; }
public string UserId {get; set; }
[ForeignKey("AId"]
public virtual A_DTO A { get; set; }
[ForeignKey("UserId"]
public virtual User User { get; set; }
}
公共A级\u DTO
{
[关键]
公共字符串Id{get;set;}
**公共虚拟B_DTO B{get;set;}**
公共虚拟列表Bs{get;set;}
}
公共B类
{
[关键]
公共字符串Id{get;set;}
公共字符串辅助{get;set;}
公共字符串用户标识{get;set;}
[外键(“援助”]
公共虚拟A_DTO A{get;set;}
[外键(“用户ID”]
公共虚拟用户用户{get;set;}
}
我正在尝试获取对象a的列表,但也包括属性B:
using AutoMapper.QueryableExtensions;
public IQueryable<A_DTO> GetAllA_DTO()
{
string userId = "8b6e9332-7c40-432e-ae95-0ac052904752";
return context.A_DTO
.Include("Bs")
.Include("B")
.Project().To<A_DTO>()
.Where(a => a.Bs.Any(b => b.UserId == userId));
}
使用AutoMapper.QueryableExtensions;
公共可查询的GetAllA_DTO()
{
字符串userId=“8b6e9332-7c40-432e-ae95-0ac052904752”;
返回context.A\u DTO
.包括(“Bs”)
。包括(B)
.Project()到()
。其中(a=>a.Bs.Any(b=>b.UserId==UserId));
}
如何根据set UserId和A_DTO.Id动态设置此属性?以下是一组观察结果,您可能很幸运地找到了解决方案: 代码优先模型中的
B
属性将导致a_DTOs的数据库表中存在一个外键,该表包含对B_DTOs表的引用。实体框架将负责使用一个对象填充B
导航属性,该对象填充了数据库中引用行的数据B_DTOs表,因此您将无法动态更改它
如果源类型和目标类型相同,则无需使用AutomapperProject
方法。在您的示例中,它们看起来都是A_DTO
。是否确实不打算在上下文中包含实体“A”和从“A”映射的“A_DTO”通过Automapper?如果这是您真正想要的,那么您可以在a中使用代码。选择
调用映射a.Bs.FirstOrDefault(b=>b.UserId==UserId)
到a\u DTO.b
。但是,您将无法在Automapper映射中基于UserId
应用过滤
如果看不到任何Automapper地图设置代码,就很难理解这里的意图
另外,在我看来,在使用.Include
时,最好使用接受表达式的重载。在您的情况下,Include将被重写:
。包括(a=>a.B)
.包括(a=>a.Bs)
如果重命名属性但未能更新.Include
语句中的字符串,使用此重载可确保出现编译时错误