我开始将EF Code First与MVC一起使用时,有些困惑。我具有以下数据库结构(对不起,但是很遗憾,我不允许发布图像):

表-产品
表-相关产品

1-多于Products.ProductID-> RelatedProducts.ProductID
1-多于Products.ProductID-> RelatedProducts.RelatedProductID

基本上,我有一个产品,可以有一系列与之相关的产品。它们以我已命名为RelatedProductID的相关产品的ProductID和ProductID定义的关系保存在RelatedProducts表中。在我的代码中,我产生了以下类:

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'."}

我究竟做错了什么?我基本上想得到一个产品,然后遍历Rel​​atedProducts并显示该产品信息。

最佳答案

答案的第一部分是EF4 CTP5不能正确将您的POCO映射到数据库,因为它不够智能。如果您 check out 数据库,则会得到:

    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);
    }

关于entity-framework-4 - EF Code First具有多对多自引用关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5273569/

10-12 12:48
查看更多