1

次のような ADO Entity Data Model によって生成されたモデルがあります。

public partial class Category
{
    public Category()
    {

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

今、私は1つのプロパティを追加しました

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、常に0Entity Framework マッピングを使用します。

しかし、異なるモデルを持つモデルをマップ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マップデータは、部分クラスのプロパティを処理できないため

この .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 に答える