使用不按预期工作的实体框架映射部分模型的数据

问题描述 投票:1回答:3

我有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; }
    }

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

entity-framework-5
3个回答
2
投票

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

检查这个.NET reflection: how to get properties defined on partial class

所以我所做的是:首先创建另一个继承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在那里。

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


0
投票

就我的解释而言,你试图绑定更多的数据,然后它就在课堂上。您只能绑定事件计数,而不是尝试使用select查询绑定c2.CategoryId,c2.Name。我不确定,但我认为这应该有效。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.