2015-12-30 125 views
1

我有三个表实体框架的多表关联

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.PersonssomeEvent.Companies),您还可以轻松获取链接到特定人员或公司的事件。

About many-to-many with EF