EF Code First со многими для многих ссылками на себя - PullRequest
9 голосов
/ 11 марта 2011

Я начинаю с использования EF Code First с MVC и немного озадачен чем-то. У меня есть следующая структура БД (извините, но мне не удалось опубликовать изображение, к сожалению):

Таблица - Продукция
Таблица - Сопутствующие товары

1-Много на Products.ProductID -> Связанные продукты.ProductID
1-Много на Products.ProductID -> Связанные продукты.RelatedProductID

В основном у меня есть продукт, который может иметь ряд продуктов, связанных с ним. Они хранятся в таблице RelatedProducts с отношением, определенным ProductID и ProductID соответствующего продукта, который я назвал RelatedProductID. В моем коде я создал следующие классы:

public class MyDBEntities : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<RelatedProduct> RelatedProducts { get; set; }
}

public class Product
{
    public Guid ProductID { get; set; }
    public string Name { get; set; }
    public string Heading { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public Guid CategoryID { get; set; }
    public string ImageURL { get; set; }
    public string LargeImageURL { get; set; }
    public string Serves { get; set; }
    public virtual List<RelatedProduct> RelatedProducts { get; set; }
}
public class RelatedProduct
{
    public Guid ProductID { get; set; }
    public Guid RelatedProductID { get; set; }
    public virtual Product Product { get; set; }
    public virtual Product SimilarProduct { get; set; }
}

Затем я пытаюсь получить доступ к ним в коде, используя:

myDB.Products.Include("RelatedProducts").Where(x => x.ProductID == productID).FirstOrDefault();

Но я продолжаю получать следующую ошибку:

{"Invalid column name 'ProductProductID2'.\r\nInvalid column name 'ProductProductID2'.\r\nInvalid column name 'ProductProductID'.\r\nInvalid column name 'ProductProductID1'.\r\nInvalid column name 'ProductProductID2'."}

Что я делаю не так? Я в основном хочу получить продукт, затем пройтись по всем связанным продуктам и отобразить информацию о продукте.

1 Ответ

10 голосов
/ 18 марта 2011

Первая часть ответа заключается в том, что EF4 CTP5 неправильно отображает ваши POCO в базу данных, потому что он недостаточно умен.Если вы проверите базу данных, вы получите:

    CREATE TABLE RelatedProducts(
        RelatedProductID uniqueidentifier NOT NULL,
        ProductID uniqueidentifier NOT NULL,
        ProductProductID uniqueidentifier NULL,
        ProductProductID1 uniqueidentifier NULL,
        ProductProductID2 uniqueidentifier NULL,
        PRIMARY KEY CLUSTERED 
        (
            RelatedProductID ASC
        )
    ) ON [PRIMARY]  

Фу!Это должно быть исправлено с некоторой ручной работой.В ваш DbContext вы добавляете правила, например, так:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .Property(p => p.ProductID)
            .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);

        modelBuilder.Entity<RelatedProduct>()
            .HasKey(rp => new { rp.ProductID, rp.RelatedProductID });

        modelBuilder.Entity<Product>()
            .HasMany(p => p.RelatedProducts)
            .WithRequired(rp => rp.Product)
            .HasForeignKey(rp => rp.ProductID)
            .WillCascadeOnDelete();

        modelBuilder.Entity<RelatedProduct>()
            .HasRequired(rp => rp.SimilarProduct)
            .WithMany()
            .HasForeignKey(rp=> rp.RelatedProductID)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }
...