2015-12-30 3 views
1

У меня есть три таблицыEntity Framework Многостоловой связь

EVENT - PERSON - COMPANY 

мне нужно иметь отношение многие-ко-многим с помощью этих таблиц. Событие может иметь одного или нескольких «клиентов», которые могут быть либо лицом, либо компанией. Как правило, не используя ORM, используя SQL, это было бы что-то вроде:

EVENT 
---- 
id 
name 

CLIENTEVENT 
----------- 
id 
clientid 
clienttype -- person or company 


PERSON 
----------- 
id 
name 
lastname 
... 


COMPANY 
------- 
id 
name 

Как этот подход может быть воспроизведен с помощью рамки сущности? Я довольно новый, используя EF, поэтому я был бы признателен за всю помощь, которую вы можете дать мне. Я использую шаблон репозитория, следуя этому подходу http://www.codeproject.com/Articles/838097/CRUD-Operations-Using-the-Generic-Repository-Pat.

ответ

0

Я советую вам вместо clientid и clienttype создать еще две колонки: personID и companyID. Модели будут выглядеть так:

public class Event  
{ 
    public int ID { get; set; } 
    public string name { get; set; } 

    public virtual ICollection<CLIENTEVENT> links { get; set; } 
} 

public class Company 
{ 
    public int ID { get; set; } 
    public string name { get; set; } 

    public virtual ICollection<CLIENTEVENT> links { get; set; } 
} 

public class PERSON 
{ 
    public int ID { get; set; } 
    public string name { get; set; } 
    public string lastname { get; set; } 

    public virtual ICollection<CLIENTEVENT> links { get; set; } 
} 

public class CLIENTEVENT 
{ 
    public int ID { get; set; } 

    public virtual PERSON person { get; set; } 
    public int? personID { get; set; } 

    public virtual Company company { get; set; } 
    public int? companyID { get; set; } 

    public virtual Event event1 { get; set; } 
    public int? event1ID { get; set; } 
} 
+0

Да, вы можете оставаться столбцами clientid и clienttype, но это не будет внешний ключ, и вы потеряете удобную связь между этими объектами в вашей базе данных (ограничение) и кодом (свойство - «ссылки»). Это имеет смысл, если кроме PERSON и COMPANY появится другой объект с одинаковыми отношениями. –

0

С EF Code First, вам не придется иметь дело с объединения таблиц как ClientEvent. Вы можете просто написать:

public class Event  
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<Company> Companies { get; set; } 

    public virtual ICollection<Person> Persons { get; set; } 
} 

public class Company 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<Event> Events { get; set; } 
} 

public class Person 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public string Lastname { get; set; } 

    public virtual ICollection<Event> Events { get; set; } 
} 

Попробуйте этот код, вы увидите EF создания двух связывающих таблицы (EventPerson и EventCompany). Теперь тип клиента представляет собой коллекцию, которую вы читаете (someEvent.Persons или someEvent.Companies), вы также можете легко получить события, связанные с определенным лицом или компанией.

About many-to-many with EF.

Смежные вопросы