С помощью 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
, что невозможно с двумя внешними ключами (оба никогда не могут быть ненулевыми в одной строке).
Заранее благодарим вас за отзывы и предложения!