簡體   English   中英

MVC 3:將EF生成的類用作強類型模型

[英]MVC 3: Using EF generated classes as strongly-typed models

此問題之后 ,我正在使用一個簡單的ViewModel類來測試將強類型模型傳遞給視圖。 達林(Darin)對我最初的問題的回答解決了我曾經遇到的問題,但現在我不得不為為什么我不能用EF生成的類做同樣的事情而scratch之以鼻。 這是我所擁有的:

public ActionResult Test()
{
    using (MyEntities db = new MyEntities())
    {
        var model = from c in db.Categories
                    select new CategoryViewModel { CategoryID = c.CategoryID, Name = c.Name };

        return View(model.ToList());
    }
}

這是CategoryViewModel:

public class CategoryViewModel
{
    public int CategoryID { get; set; }
    public string Name { get; set; }
}

在我看來,我只是簡單地介紹模型。 這將產生所需的結果。 但是,EF為我生成的類之一是Category。 最初,我試圖使用它來構建強類型模型並將其傳遞給視圖,如下所示:

public ActionResult Test()
{
    using (MyEntities db = new MyEntities())
    {
        var model = from c in db.Categories
                    select new Category { CategoryID = c.CategoryID, Name = c.Name };

        return View(model.ToList());
    }
}

這給了我以下錯誤:

“無法在LINQ to Entities查詢中構造實體或復雜類型'MyProjectModel.Category'。”

所以我的問題是,CategoryViewModel和Category和為我生成的Category之間有什么區別? 是什么阻止我在這種情況下將類別用作模型類型? 我今天一直在尋找關於SO的其他問題(和答案),但是我一直無法找到討論該問題的東西。 在這些帖子中,我還看到了其他一些新術語(伙伴類,自動映射器,POCO),但在不了解我的問題根源的情況下研究它們似乎還為時過早。

我真的很感謝一些見識。

盡管我不知道為什么我敢打賭實體框架不喜歡在您要編寫查詢的屬性中選擇相同類型的new對象。 如果我的假設正確,則以下代碼應等效於您嘗試執行的操作:

public ActionResult Test()
{
    using (MyEntities db = new MyEntities())
    {
        var model = from c in db.Categories;

        return View(model.ToList());
    }
}

僅在將上下文的類的屬性映射到另一個類(即不是由EF生成的一個類)時,才需要選擇新對象。

我對這個問題做了一些進一步的研究,包括自己復制它,根據堆棧跟蹤,這是引發異常的地方: System.Data.Objects.ELinq.ExpressionConverter.CheckInitializerType(Type type)這是CheckInitializerType的源代碼( 在這里找到 ):

 // Determines whether the given type is supported for materialization
    private void CheckInitializerType(Type type)
    {
        // nominal types are not supported
        TypeUsage typeUsage;
        if (_funcletizer.RootContext.Perspective.TryGetType(type, out typeUsage))
        {
              BuiltInTypeKind typeKind = typeUsage.EdmType.BuiltInTypeKind;
              if (BuiltInTypeKind.EntityType == typeKind ||
                  BuiltInTypeKind.ComplexType == typeKind)
              {
                  throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_UnsupportedNominalType(
                            typeUsage.EdmType.FullName));
              }
        }

        // types implementing IEnumerable are not supported
        if (TypeSystem.IsSequenceType(type))
        {
             throw EntityUtil.NotSupported(System.Data.Entity.Strings.ELinq_UnsupportedEnumerableType(
                        DescribeClrType(type)));
        }
   }

由於我尚未確定的原因,如果您嘗試將屬性投影到的BuiltInTypeKind具有EntityTypeComplexTypeBuiltInTypeKind ,則不支持投影。 通過測試,我發現可以將屬性投影到由另一個edmx文件生成的實體上,因此與給定ObjectContext的關系似乎可以歸結為裝飾所生成的Entity類的System.Data.Objects.DataClasses.EdmEntityTypeAttribute

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM