Отношение один ко многим Свободно API Code First - PullRequest
1 голос
/ 25 марта 2012

Это мой первый вопрос, я надеюсь, что он не глупый.

У меня есть следующие лица здесь

Телефоны компаний-клиентов

public class Customers 
{
    public Customers()
    {
        Phones = new List<Phones>();
    }

    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<Phones> Phones { get; set; }
}
public class Phones
{
    public Guid Id { get; set; }
    public string Number { get; set; }
    public string Extension { get; set; }

}

public class Companies
{
    public Companies()
    {
        Phones = new List<Phones>();
    }

    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<Phones> Phones { get; set; }        
}

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

Ответы [ 3 ]

6 голосов
/ 25 марта 2012

Я не уверен, хотите ли вы следующее:

modelBuilder.Entity<Customers>()
    .HasMany(c => c.Phones)
    .WithOptional()
    .Map(m => m.MapKey("CustomerPhoneId"));

modelBuilder.Entity<Companies>()
    .HasMany(c => c.Phones)
    .WithOptional()
    .Map(m => m.MapKey("CompanyPhoneId"));

Использование MapKey необязательно.Это просто дает столбцу внешнего ключа имя, которое вы хотите.Если вы опустите этот EF, то создадите стандартное имя (что-то с подчеркиванием: ..._Id).

На самом деле все сопоставление является необязательным, поскольку соглашения о сопоставлении просто создают одни и те же отношения без какого-либо сопоставления Fluent API..

Таблица Phones будет иметь два внешних ключа, допускающих нулевое значение CustomerPhoneId и CompanyPhoneId, относящиеся к таблице Customers и таблице Companies соответственно.

Редактировать

Альтернативой, которая потребует только один внешний ключ в таблице Phone для нескольких различных объектов, будет отображение наследования:

public abstract class OrganizationsWithPhone
{
    public OrganizationsWithPhone()
    {
        Phones = new List<Phones>();
    }

    public Guid Id { get; set; }
    public ICollection<Phones> Phones { get; set; }
}

public class Customers : OrganizationsWithPhone
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Companies : OrganizationsWithPhone
{
    public string Name { get; set; }
}

public class Phones
{
    public Guid Id { get; set; }
    public string Number { get; set; }
    public string Extension { get; set; }
}

Отображение:

modelBuilder.Entity<OrganizationsWithPhone>()
    .HasMany(o => o.Phones)
    .WithOptional() // or .WithRequired()
    .Map(m => m.MapKey("OrganizationsWithPhoneId"));

modelBuilder.Entity<OrganizationsWithPhone>()
    .ToTable("OrganizationsWithPhone");

modelBuilder.Entity<Customers>()
    .ToTable("Customers");

modelBuilder.Entity<Companies>()
    .ToTable("Companies");

Теперь у вас есть только одно отношение внешнего ключа между Phones и базовой таблицей OrganizationsWithPhone, но благодаря отображению наследования существуют дополнительные взаимно-однозначные отношения между базовой таблицей и таблицами для производных объектов Customers и Companies.В основном количество необходимых отношений остается неизменным (или даже больше в этой модели).

В этой модели клиент и компания не могут использовать одни и те же телефонные номера, поскольку строка в таблице Phones относится к строкеOrganizationsWithPhone, который может быть либо клиентом, либо компанией, но не обоими одновременно.

Базовая таблица OrganizationsWithPhone имеет только один столбец Id.Если у вас есть более общие свойства во всех производных объектах, вы можете переместить их в базовые права.

1 голос
/ 27 марта 2012

Что вам нужно, так это то, что я называю таблицей ассоциации, вам нужно заставить EF создать отдельную таблицу для хранения деталей отношений. Я не знаю, способен ли EF сделать это или нет. Но если вы согласны с изменением вашей объектной модели, то одним из решений может быть назначение конкретных типов для этих таблиц.

public class CustomerPhone
{
    public int Id { get; set; }
    public Customers Customer { get; set; }
    public Phones Phone { get; set; }
}
public class CompanyPhone
{
    public int Id { get; set; }
    public Companies Company { get; set; }
    public Phones Phone { get; set; }
}

Теперь эти классы могут содержать отношения, поэтому теперь вы можете заменить Phone на них:

public class Customers
{
    public Customers()
    {
        Phones = new List<CustomerPhone>();
    }

    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public ICollection<CustomerPhone> Phones { get; set; }
}
public class Companies
{
    public Companies()
    {
        Phones = new List<CompanyPhone>();
    }

    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<CompanyPhone> Phones { get; set; }
}

Таким образом, у вас есть возможность добавить больше деталей в ваши отношения, такие как дата создания и т. Д.

0 голосов
/ 26 марта 2012

См. Этот учебник - между инструктором и факультетом, между курсом и зачислением, а также между учеником и зачислением существует множество отношений, которые вы можете использовать в качестве моделей:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

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