1

我有由 ADO 实体数据模型生成的模型,例如:

public partial class Category
{
    public Category()
    {

    }    
    public int CategoryId { get; set; }
    public string Name { get; set; }
}

现在我添加了一个属性

public partial class Category
{
    public int EventsCount { get; set; }
}

现在我正在尝试通过以下方式进行映射://这是有效的查询

List<Category> retVal = db.Database.SqlQuery<Category>(
                //retVal = db.Categories.SqlQuery(
                        @"SELECT c2.CategoryId,c2.Name,c1.EventsCount AS EventsCount FROM (
                        SELECT c.CategoryId, COUNT(c.CategoryId) AS EventsCount FROM Category c
                        JOIN EventCategory ec ON ec.CategoryId = c.CategoryId
                        JOIN (SELECT * FROM EVENT WHERE EventDateTime > DATEADD(D, 0, DATEDIFF(D, 0, GETDATE()))) e ON e.EventId = ec.EventId
                        WHERE c.ImportedFrom IS NULL                    
                        GROUP BY c.CategoryId) c1
                        join Category c2 ON c1.CategoryId = c2.CategoryId").ToList();

我在 Management Studio 上执行原始 sql 得到的实际数据

在此处输入图像描述

EventCounts总是0与实体框架映射,

但是如果我用不同的模型映射模型EventsCount,那么它就会被映射。

喜欢:

public partial class Category
    {
        public Category()
        {

        }    
        public int CategoryId { get; set; }
        public string Name { get; set; }
        public int EventsCount { get; set; }
    }

现在已经映射了所有列,这里有什么想法,为什么实体框架不映射部分模型?

4

3 回答 3

2

我没有得到确切的答案,但我通过继承模型而不是制作部分类得到了解决方案。由于借助反射和反射的 EntityFramework mapp 数据无法处理具有部分类的属性

检查这个 .NET 反射:如何获取在部分类上定义的属性

所以我所做的是:首先用 EF 生成的继承类创建另一个类,并添加我们想要的属性。

public partial class CategoryEx:Category
{
    public int EventsCount { get; set; }
}

当然,

List<CategoryEx> retVal = db.Database.SqlQuery<Category>(
                //retVal = db.Categories.SqlQuery(
                        @"SELECT c2.CategoryId,c2.Name,c1.EventsCount AS EventsCount FROM (
                        SELECT c.CategoryId, COUNT(c.CategoryId) AS EventsCount FROM Category c
                        JOIN EventCategory ec ON ec.CategoryId = c.CategoryId
                        JOIN (SELECT * FROM EVENT WHERE EventDateTime > DATEADD(D, 0, DATEDIFF(D, 0, GETDATE()))) e ON e.EventId = ec.EventId
                        WHERE c.ImportedFrom IS NULL                    
                        GROUP BY c.CategoryId) c1
                        join Category c2 ON c1.CategoryId = c2.CategoryId").ToList(); 

现在EventsCount在那里。

我不知道,但它可能对某人有帮助。

于 2013-07-11T10:24:20.513 回答
0

就我的解释而言,您正在尝试绑定更多的数据,然后它就在课堂上。您可以仅绑定事件计数,而不是尝试使用选择查询绑定 c2.CategoryId、c2.Name。我不确定,但我认为这应该可行。

于 2013-07-18T10:26:01.820 回答
0

我遇到了同样的问题。这似乎是EF中的一个错误。对我来说,解决方案是优秀的Dapper库。它只是一堆扩展方法,因此可以与 EF 一起工作。

于 2019-03-15T18:43:22.163 回答