2012-03-04 3 views
0

У меня неприятности получать это право ...EntityFramework - основной проект или веб-проект с общими объектами?

У меня есть проект «ядро» с общим набором функциональных возможностей, включая, например, мечения. Маркировка включает в себя набор объектов, некоторые из которых включают 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 (uniqueidentifier RecipeId, string Name) 

Моего проект «Веб» также имеет модель данных с соответствующим контекстом (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 контекст? Может ли быть другой эффективный способ объединения этих двух?

+0

вам действительно нужны две отдельные контексты ли? – veblock

+0

@veblock: У меня есть две отдельные сборки с двумя разными файлами '.edmx'. Visual studio автоматически создает два контекста ... Я не уверен, могу ли я каким-то образом использовать контекст? Я предпочитаю повторно использовать контекст из моего проекта «Core», однако не стоит добавлять «Web» в «Core» .edmx'. файл. – ReFocus

+0

Ну не может думать о каком-либо простом решении. Пока у вас есть 2 отдельных контекста, он будет ресурсоемким. Я бы предпочел придумать универсальную модель сущности для удовлетворения обоих случаев. – veblock

ответ

1

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

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

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

var recipes = from r in MyEntities.Recipe.Include("Tags") 
       select r 
       where r.Name == "Granny's Meatloaf"; 
+0

Я понимаю, однако генератор 'DbContext' создает несколько контекстов. Я не могу помещать все сущности в один и тот же проект, потому что сущности 'Web' специфичны для проекта' Web'. Сущность 'Tag', например, является универсальной функциональностью, которая используется в нескольких проектах ... – ReFocus

+0

@ReFocus Тем не менее вы можете сопоставить ее с' WebEntities'. – Eranga

+0

@Erange: Я не понимаю, как это будет сделано? Контекст 'WebEntities' генерируется автоматически ... Он содержит' DbSet ', в то время как' CoreEntities' содержит 'DbSet '. Что вы подразумеваете под «сопоставить его с« WebEntities »? – ReFocus

0
var recipes = (from r in WebEntities.Recipe 
       select r 
       where r.Name == "Granny's Meatloaf").ToList();