2013-08-05 6 views
1

Может ли кто-нибудь показать мне, как создать отношения в моем примере EF codefirst - Мне нужны отношения в классе Products, которые имеют много отношения к классу Product_Spec, поэтому, когда я компилирую код, он будет иметь отношения, когда базы данных генерируются, а также соотношение для класса спецификаций, связанного с данных класса Context Product_SpecEF codefirst отношения

классов:

namespace MvcApplication1.Models 
{ 
    public class Department 
    { 
     [Key] 
     public long Id { get; set; } 

     [Required(ErrorMessage="Please enter a name for the departments.")] 
     [DataType(DataType.Text)] 
     public string Name { get; set; } 

     [DataType(DataType.Text)] 
     [Required(ErrorMessage = "Please enter a valid url for the department.")] 
     public string Url { get; set; } 

     public virtual List<Product> Products { get; set; } 
    } 


    public class Product 
    { 
     [Key] 
     public long Id { get; set; } 
     [ForeignKey("FK_Department_Id")] 
     public long DepartmentId { get; set; } 
     [DataType(DataType.Text)] 
     public string Title { get; set; } 

     [DataType(DataType.Currency)] 
     public decimal UnitPrice { get; set; } 
     [DataType(DataType.Currency)] 
     public decimal SellPrice { get; set; }    

    } 

    public class Product_Spec 
    {   
     [ForeignKey("FK_Spec_ProductId")] 
     public long ProductId { get; set; } 

     [ForeignKey("FK_Spec_SpecId")] 
     public long SpecId { get; set; }   
    } 

    public class Specification 
    { 
     [Key] 
     public long SpecId { get; set; } 
     [DataType(DataType.Text)] 
     [Required(ErrorMessage = "Please enter a product specification type.")] 
     public string Type { get; set; } 
     [DataType(DataType.Text)] 
     [Required(ErrorMessage = "Please enter a product specification value.")] 
     public string Value { get; set; } 

    } 


} 


namespace MvcApplication1 
{ 

    public class DataContext : DbContext 
    { 
     public DbSet<Department> Department { get; set; } 
     public DbSet<Product> Product { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Department>().HasRequired(x => x.Products) 
       .WithMany().HasForeignKey(x => x.Id).WillCascadeOnDelete(true); 

      modelBuilder.Entity<Product>().HasOptional(x => x.Product_Specs) 
       .WithMany().HasForeignKey(x =>x.ProductId) // this lines doesn't work 

      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

ответ

0

Я думаю, вы должны установить имена столбцов в ForeignKey атрибуте, а не тяготы имен:

public class Product 
{ 
    [Key] 
    public long Id { get; set; } 
    public long DepartmentId { get; set; } 

    [DataType(DataType.Text)] 
    public string Title { get; set; } 

    [DataType(DataType.Currency)] 
    public decimal UnitPrice { get; set; } 

    [DataType(DataType.Currency)] 
    public decimal SellPrice { get; set; } 

    [ForeignKey("DepartmentId")] 
    public virtual Department Department { get; set; } 

    public ICollection<Product_Spec> ProductSpecs { get; set; } 
} 

public class Product_Spec 
{     
    public long ProductId { get; set; }   
    public long SpecId { get; set; } 

    [ForeignKey("ProductId")] 
    public virtual Product Product {get; set;}   
} 
0

Похоже, вы пытаетесь создать взаимосвязь Many-Many между Products и Specifications. Если это так, вам не нужно определять Product_Spec, используя соглашения по умолчанию, Entity Framework создаст необходимую таблицу соединений для вас, если вы внесете некоторые изменения в свои сущности (чтобы определить взаимосвязь).

В вашем случае, вы могли бы сделать следующие изменения:

public class Product 
{ 
    // Your other code 

    // [ForeignKey("FK_Department_Id")] - Not required, EF will configure the key using conventions 
    public long DepartmentId { get; set; }   

    public virtual ICollection<Specification> Specifications { get; set; } // Navigation property for one end for your Product *..* Specification relationship. 
} 

public class Specification 
{ 
    // Your other code 
    public virtual ICollection<Product> Products { get; set; } 
} 

Когда ваши таблицы созданы, вы должны увидеть таблицу с именем, как SpecificationProducts, что таблица спая используется для хранения ваших много. .many Product/Specification отношений.

Если вам необходимо явно определить это отображение (например, если вы имели существующие таблицы), вы должны быть в состоянии сделать что-то вроде этого:

modelBuilder.Entity<Product>(). 
    HasMany(s => s.Specifications). 
    WithMany(p => p.Products). 
    Map(
    m => 
    { 
    m.MapLeftKey("ProductId"); 
    m.MapRightKey("SpecId"); 
    m.ToTable("SpecificationProducts"); 
    }); 
Смежные вопросы