EntityFramework - основной проект против веб-проекта с общими объектами? - PullRequest
0 голосов
/ 05 марта 2012

У меня проблемы с получением этого права ...

У меня есть проект "Core" с общим набором функций, включая, например, Tagging .Маркировка включает в себя набор сущностей, некоторые из которых включают Tag и ObjectTag.

Они в основном выглядят так:

Tag       (uniqueidentifier TagId, nvarchar(max) Tag)
ObjectTag (uniqueidentifier TagId, uniqueidentifier ObjectId)

Мой проект "Core" также содержит модель данных сDbContext называется CoreEntities.Таким образом, я могу сделать следующее:

from ot in CoreEntities.Tag select ot where ot.TagId = "{someguid}"

У меня также есть проект "Web", который включает в себя объект, специфичный для моего сайта, например Recipe .Рецепт выглядит следующим образом:

Recipe    (uniqueidentifier RecipeId, string Name)

Мой проект "Web" также имеет модель данных с соответствующим контекстом (WebEntities), которая делает возможным следующее:

var recipes = from r in WebEntities.Recipe 
              select r 
              where r.Name == "Granny's Meatloaf"

foreach(var r in recipes) {
    var recipeTags = from t in CoreEntities.ObjectTag 
                     select t 
                     where t.ObjectId == r.RecipeId
}

Это довольноресурсоемкий, так как для каждой Recipe должны быть извлечены соответствующие ObjectTag записи.При попытке присоединиться к сущностям я получил следующую ошибку: «Указанное выражение LINQ содержит ссылки на запросы, связанные с различными контекстами». Значит ли это, что мне нужно добавить ObjectTag в мой WebEntities контекст?Может ли быть какой-то другой эффективный способ присоединиться к ним?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Вы не разделяете связанные сущности на различные контексты при использовании EF.Классы сущностей могут находиться в разных пространствах имен (проекты и т. Д.), Но они должны быть частью одного контекстного порядка для определения расширенной модели.

Было бы лучше создать проект библиотеки классов, который будет содержатьвсе доменные объекты.Это позволит вам объявлять навигационные свойства без взаимозависимых модулей проекта.

Запрос будет очень простым

var recipes = from r in MyEntities.Recipe.Include("Tags") 
              select r 
              where r.Name == "Granny's Meatloaf";
0 голосов
/ 05 марта 2012
var recipes = (from r in WebEntities.Recipe 
              select r 
              where r.Name == "Granny's Meatloaf").ToList();
...