9

私はMVCでEFCodeFirstを使用することから始めており、何かに少し困惑しています。私は次のdb構造を持っています(申し訳ありませんが、残念ながら画像を投稿することはできませんでした):

表-製品
表-関連製品

1-多くのProducts.ProductID->RelatedProducts.ProductID1-
多くの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'."}

私は何が間違っているのですか?基本的に、商品を入手してから、RelatedProductsを繰り返し処理し、その商品情報を表示したいと思います。

4

1 に答える 1

10

答えの最初の部分は、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);
    }
于 2011-03-18T03:09:32.007 に答える