2013-06-24 2 views
13

У меня проблема с отображением в Entity Framework.Как сопоставить тип значения, который имеет ссылку на объект?

У меня есть следующие классы (упрощенные):

public class Building 
{ 

    public int ID { get; set; }  
    // *.. snip..* other properties 
    public Location Location { get; private set; } 
} 

public class Location 
{ 
    public string Street {get; set;} 
    public Country country {get; set} 
} 
public class Country 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

Строительство и страны являются юридическими лицами, они сохраняются в базе данных. Расположение - это тип значения и должен отображаться в той же таблице, что и «Строительство».

Однако, когда я сопоставляю его таким образом, инфраструктура сущности также хочет сопоставить местоположение с таблицей и жалуется, что у нее нет ключа. Я не хочу давать ему ключ, поскольку он принадлежит зданию и не должен быть сущностью вообще.

Я видел обходные пути, которые говорят, что вам нужно поместить страну в класс здания, но это просто не очень хорошо (и семантически просто неправильно).

Я использую Entity Framework 5

+0

Вы ищете [сложные типы] (http://weblogs.asp.net/manavi/archive/2011/03/28/associations-in-ef-4-1-code-first -part-2 -комплекс-types.aspx). –

+1

Да, я знаю, проблема в том, что как только этот сложный тип имеет ссылку на сущность, EF также хочет поставить сложный тип в таблицу – Kenneth

+0

Какой хороший вопрос. Фактически, я обычно фокусируюсь на логике домена, и мне все равно, как ORM сохраняет данные (поэтому я бы не стал добавлять столбец Id в Location в качестве большой проблемы). Если мне действительно нужно заботиться о том, как хранятся данные, я бы подумал о том, чтобы не смешивать объекты домена с объектами ORM, создавая определенный уровень для сохранения (создание объектов для посещения ORM), хотя это может усложнить процесс архитекторизации. Если вы пришли к выводу, сообщите нам, возможно, CQRS разрешит это. – Alisson

ответ

-3

Вы можете отметить расположение объекта в классе здания с [NotMapped] Attribute.

using System.ComponentModel.DataAnnotations.Schema; 
public class Building 
{ 
    [NotMapped] 
    public Location Location { get; private set; } 
} 

Надеюсь, что решает вашу проблему!

+0

Я не думаю, что это то, что он ищет. Это не спасло бы местоположения сущностей, которые он хочет делать. –

+0

Действительно, это не решает проблему. Я хочу, чтобы местоположение внутри Стол-здания со ссылкой на таблицу стран. Мне нужно, чтобы оно отображалось – Kenneth

+0

В этом случае, я думаю, вам нужно будет отобразить «местоположение» в таблице, которая связывает таблицы зданий и страны. – Devasayal