Код EntityFramework Первый подход для сопоставления извилистой таблицы ссылок на устаревшую базу данных? - PullRequest
0 голосов
/ 04 декабря 2011

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

**Profile**:
profile_id
first_name
last_name

**OneBigLookupTableToRuleThemAll**:
lookup_id (PK)
category_id (PK) (refers to a recrod in a OneBigCategoryTableToRuleThemAll)
description (basically a label)

**ProfileProperties**:
property_key (PK GUID)
profile_id  
lookup_id 

UNIQUE constraint on profile_id, lookup_id

В качестве примера двух категорий:

Degrees (MD, PhD, MS, MPH, etc) -- cat_id 1, for example
Job Responsibilities (Statistician, Medical Doctor, Epidemiologist, etc) -- cat_id 2

Итак, в таблице Lookup мы получаем такие вещи:

lookup_id, cat_id, description
1        , 1     , MD
2        , 1     , PhD
3        , 1     , MS
4        , 1     , MPH
5        , 2     , Statistician
6        , 2     , Medical Doctor
7        , 2     , Epidemiologist

Таким образом, в таблице ProfileProperties мы получаем такие вещи, как:

property_key, profile_id, lookup_id
some guid     , 1         , 1        -- MD degree
some guid     , 1         , 4        -- MPH degree
some guid     , 1         , 6        -- Medical Doctor

Я хотел бы иметь такой объект:

public class Profile {
  public int ProfileId { get; }
  public string FirstName { get; set; }
  public string LastName { get; set; }

  public ICollection<JobResponsibility> JobResponsibilities { get; set; }
  public ICollection<Degree> Degrees { get; set; }
}

public class JobResponsibility {
 public int Id { get; set; }
 public string Description { get; set; }
}

public class Degree {
 public int Id { get; set; }
 public string Description { get; set; }
}

- На самом деле, в установщиках идентификатора я хотел бы ограничить значение одним из фактических значений в базе данных,хотя я не уверен, что пойду на полную поддержку типа Enum (и я знаю, что сначала код не поддерживает это)

Я считаю, что один из сценариев отображения EntityFramework должен быть в состоянии справиться с этим,но я не могу понять, что мне нужно сделать, чтобы заставить это работать.

У кого-нибудь есть какие-либо советы или ресурсы, которые я могу прочитать по этому сценарию?Я думаю, что на самом деле все закончится очень просто, но я новичок в EF.

Спасибо, Джош

1 Ответ

1 голос
/ 04 декабря 2011

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

public class Profile
{
    public int ProfileId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<ProfileProperty> Properties { get; set; }
}

public class ProfileProperty
{
    public Guid PropertyId { get; set; }
    public int ProfileId { get; set; }
    public int PropertyId { get; set; }
    public virtual Profile Profile { get; set; }
    public virtual Property Property { get; set; }
}

public class Property
{
    public int LookupId { get; set; }
    public int CategoryId { get; set; }
    public string Description { get; set; }
}

Теперь, если вы хотите иметь свойства, такие как градусы, вам нужно будет добавить не сопоставленное свойство, например:

public IEnumerable<Property> Degrees
{ 
    get { return Properties.Where(p => p.Property.CategoryId == 1)
                           .Select(p => p.Property);
} 

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

Даже поддержка перечислений, запланированных для .NET 4.5, не решит эту проблему.Перечисления будут поддерживать представление только одного целочисленного столбца как перечисления, но в вашем случае вам необходимо разложить отношение многие ко многим перечислениям.

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