MVC 3: Использование сгенерированных EF классов в качестве строго типизированных моделей - PullRequest
0 голосов
/ 20 июня 2011

Исходя из этого вопроса , я использую простой класс ViewModel для проверки передачи строго типизированной модели в представление. В то время как ответ Дарина на мой первоначальный вопрос решил проблему, с которой я столкнулся, теперь я не могу почесать голову, почему я не могу сделать то же самое с классом, созданным EF. Вот что у меня есть:

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());
    }
}

Это выдало мне следующую ошибку:

"Сущность или сложный тип 'MyProjectModel.Category' не могут быть созданы в запросе LINQ to Entities."

Итак, мой вопрос: в чем разница между CategoryViewModel и Category, отличными от Category, создаваемой для меня? Что мешает мне использовать Category в качестве типа моей модели в этом сценарии? Я просматривал другие вопросы (и ответы) о SO сегодня, но я не смог найти то, что обсуждает это. Я также видел несколько других новых терминов, упомянутых в этих постах (классы собеседников, autoppers, POCO), но, кажется, преждевременно изучать их, не понимая основы моей проблемы.

Я бы очень признателен за понимание.

1 Ответ

1 голос
/ 20 июня 2011

Хотя я не знаю точно, почему я уверен, что структура сущностей не любит выбирать new объекты того же типа в свойстве, из которого вы пишете свой запрос.Если мое предположение верно, следующий код должен быть эквивалентен тому, что вы пытаетесь сделать:

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

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

Вам нужно будет только выбирать новые объекты, когда вы сопоставляете свойства классов вашего контекста с другим классом (IE не тот, который сгенерирован 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 из EntityType или ComplexType, тогда проекция не поддерживается.В ходе тестирования я обнаружил, что могу проецировать свойства на сущность, сгенерированную с помощью другого файла edmx, поэтому отношения с данным ObjectContext, похоже, сводятся к System.Data.Objects.DataClasses.EdmEntityTypeAttribute, который украшает сгенерированный класс Entity.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...