2011-05-16 12 views
17

Estoy atascado al intentar escribir el primer modelo de Entity Framework 4.1 code para la siguiente relación de base de datos.Múltiples claves externas que apuntan a la misma tabla en el código de Entity Framework 4.1 primero

Aquí hay una representación visual de la relación. enter image description here

dbo. [Empresas] puede tener vendedor o deudor como tipos de empresa.

dbo. [SellerDebtors] define la conexión que una compañía vendedora tiene con una empresa deudora.

El código que he escrito se basa en mi código de modelo de POCO EF 4.0 original. Esto es lo que se me ocurrió: este código no funciona.

public class SellerDebtor 
{ 
    public int SellerDebtorId { get; set; } 
    public int DebtorCompanyId { get; set; } 
    public int SellerCompanyId { get; set; } 

    public Company DebtorCompany { get; set; } 
    public Company SellerCompany { get; set; } 

    public ICollection<SellerDebtorInfo> SellerDebtorInfos { get; set; } 
    public ICollection<SellerDebtorFile> SellerDebtorFiles { get; set; }  
} 


public class Company 
{ 
    public int CompanyId { get; set; } 
    public string CompanyType { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<CompanyInfo> CompanyInfos { get; set; } 
    public virtual ICollection<CompanyFile> CompanyFiles { get; set; } 

    public virtual ICollection<SellerDebtor> SellerDebtorDebtorCompanies { get; set; } 
    public virtual ICollection<SellerDebtor> SellerDebtorSellerCompanies { get; set; } 

} 

Por el momento, me estoy haciendo esto como un error:

System.Data.SqlClient.SqlException: Invalid column name 'DebtorCompany_CompanyId'. 
Invalid column name 'SellerCompany_CompanyId'. 
Invalid column name 'Company_CompanyId'. 
Invalid column name 'Company_CompanyId1'. 

Idealmente, me gustaría ser capaz de mantener la denominación de las relaciones.

Supongo que tengo que establecer algunos atributos, pero no estoy seguro de qué configurar.

+0

Posible duplicado de [Entity Framework CODIGO - dos claves externas de la misma mesa] (http://stackoverflow.com/questions/5559043/entity-framework-code-first-two- foreign-keys-from-same-table) –

Respuesta

18

EF no puede determinar por convención qué propiedades de navegación en sus 2 clases pertenecen juntas y crea 4 relaciones (sin un extremo del otro lado) en lugar de 2 (con extremos en ambos lados). Este problema ocurre siempre cuando tiene más de una propiedad de navegación del mismo tipo (Company en su caso) en la misma clase. Se podría tratar de solucionar este problema de la siguiente manera:

public class SellerDebtor 
{ 
    public int SellerDebtorId { get; set; } 
    [ForeignKey("DebtorCompany")] 
    public int DebtorCompanyId { get; set; } 
    [ForeignKey("SellerCompany")] 
    public int SellerCompanyId { get; set; } 

    [InverseProperty("SellerDebtorDebtorCompanies")] 
    public Company DebtorCompany { get; set; } 
    [InverseProperty("SellerDebtorSellerCompanies")] 
    public Company SellerCompany { get; set; } 

    public ICollection<SellerDebtorInfo> SellerDebtorInfos { get; set; } 
    public ICollection<SellerDebtorFile> SellerDebtorFiles { get; set; }  
} 

[InverseProperty(...)] define la propiedad de navegación en el otro extremo de la relación y se dice explícitamente EF que parejas de propiedades de navegación pertenecen juntos en una relación.

3

Este blog tiene el ejemplo que usa configuraciones de API Fluent.

Multiple foreign keys within same table using CodeFirst Entity Framework and Fluent API

modelBuilder.Entity<Branch>().HasOptional(b => b.PrimaryContact)   
      .WithMany(a => a.PrimaryContactFor).HasForeignKey(b=>b.PrimaryContactID); 
+0

Realmente me alegro de que hayas publicado esto. Necesitaba este ejemplo de Fluent API hoy. – Brandon

+0

En mi humilde opinión la mejor respuesta. La API fluida es tan clara como un día soleado. – alex440

Cuestiones relacionadas