Entity Framework CTP5 Code-First: Сопоставление класса с несколькими коллекциями другого класса

С помощью EF CTP5 Code-First я пытаюсь сопоставить модель класса, которая содержит несколько коллекций в одном классе, указывающих на другой класс. Вот пример того, что я имею в виду:

public class Company
{
    public int CompanyId { get; set; }
    public IList<Person> FemaleEmployees { get; set; }
    public IList<Person> MaleEmployees { get; set; }
}

public class Person
{
    public int PersonId { get; set; }
    public Company Company { get; set; }
}

Если я позволю базе данных создать из этой модели с DbContext без дальнейшей настройки, например:

public class MyContext : DbContext
{
    public DbSet<Company> Companies { get; set; }
    public DbSet<Person> People { get; set; }
}

... тогда я получу две таблицы в SQL Сервер, простая таблица Companies только со столбцом CompanyId и таблица People со следующими столбцами («FKRN» означает «Имя отношения внешнего ключа», поскольку создан EF в SQL Server):

PersonId            int     not nullable
CompanyCompanyId    int     nullable       FKRN: Company_FemaleEmployees
CompanyCompanyId1   int     nullable       FKRN: Company_MaleEmployees
CompanyCompanyId2   int     nullable       FKRN: Person_Company

Все три последних столбца имеют отношение внешнего ключа к первичному ключу CompanyId таблицы Companies .

Теперь у меня есть несколько вопросы:

  • 1) Почему я получаю три столбца внешнего ключа в таблице People ? На самом деле я ожидал двух. Если я удалю собственность публичной компании Company {get; установлен; } у Person третий столбец CompanyCompanyId2 исчезает, но я также теряю ссылочное свойство в классе.

  • 2) Допустим, я отбрасываю Company из таблицы Person (мне это действительно не нужно в моей модели). Есть ли способ дать двум оставшимся столбцам внешнего ключа другое имя, отличное от автоматически созданного CompanyCompanyId и CompanyCompanyId1 ? (Например, FCompanyId и MCompanyId , чтобы указать отношение к коллекциям FemaleEmployees и MaleEmployees ).)

  • 3) Есть ли какие-либо способ определить эту модель только с одним внешним ключом CompanyId в таблице People ? Конечно, мне понадобится дифференцирующий дополнительный столбец в классе Person (например, bool IsFemale ). Person является частью коллекции FemaleEmployees или MaleEmployees , но никогда в обоих (естественно, в этом примере), поэтому с помощью SQL я мог получить эти коллекции с помощью чего-то вроде WHERE IsFemale = true / false AND CompanyId = 1 . Мне интересно, могу ли я дать EntityFramework подсказку, чтобы загрузить две коллекции таким образом. (Здесь я бы не хотел расширять модель классами FemalePerson и MalePerson , которые оба являются производными от Person в качестве базового класса, а затем используют, например, Table- Сопоставление по иерархии, поскольку эти производные классы были бы пустыми и искусственными и не имели другой цели, кроме включения сопоставления с SQL Server.) Наличие только одного внешнего ключа CompanyId позволило бы мне сделать его не -nullable , что невозможно с двумя внешними ключами (оба никогда не могут быть ненулевыми в одной строке).

Заранее благодарим вас за отзывы и предложения!

5
задан Slauma 21 February 2011 в 15:20
поделиться