实体框架 - 从查询中动态设置模型属性值

时间:2014-10-08 12:48:29

标签: 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; }
    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_DTO的列表,但也包括属性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));
    }

如何根据set UserId和A_DTO.Id?

动态设置此属性

1 个答案:

答案 0 :(得分:1)

以下是一系列观察,您可能很幸运地找到了解决方案:

代码优先模型中的B属性将导致A_DTO数据库表中存在外键,其中包含对B_DTO表的引用。实体框架将负责使用填充了B_DTO表中引用行的数据的对象填充B导航属性,因此您将无法动态更改它。

如果源类型和目标类型相同,则无需使用Automapper Project方法。在您的示例中,它们似乎都是A_DTO。你确定你实际上并不打算拥有一个实体&#34; A&#34;包含在上下文和&#34; A_DTO&#34;从&#34; A&#34;映射通过Automapper?如果这是您真正想要的,那么您可以在.Select调用映射A.Bs.FirstOrDefault(b => b.UserId == userId)A_DTO.B中使用代码。但是,您无法根据自动映射地图中的userId应用过滤。

在没有看到任何Automapper Map设置代码的情况下,很难在这里了解意图。

顺便说一句,在使用.Include时,在我看来,最好使用带表达式的重载。在您的情况下,包含将被重写:

.Include(a => a.B)
.Include(a => a.Bs)

使用此重载可确保在重命名属性但未能更新.Include语句中的字符串时会出现编译时错误。