9

私はMVCでEFコードファーストを使用して始めて、何かで困惑しています。 - 製品
表 - Products.ProductID上RelatedProductsEFコード最初に多対多の自己参照関係を持つ

1対多 - > RelatedProducts.ProductID

表:私は、次のDB構造を(申し訳ありませんが、私は残念ながら画像を投稿することが許されなかった)持っています1-Many on Products.ProductID-> RelatedProducts.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'."} 

何私のコードでは、私は次のクラスを生産しています私は間違っている?私は基本的に製品を入手してからRelatedProductsを繰り返し、その製品情報を表示したいと考えています。

答えて

9

答えの最初の部分は、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); 
    } 
+0

Product.ProductIDとRelatedProduct.RelatedProductIDの関係に削除をカスケードすることはできませんので注意してください。これはEF4の制限ではありません。サイクリックカスケード削除を防止する必要があります。 – anon

+0

また、関係は対称ではありません。 product1がproduct2に関連して追加された場合、product2はproduct1に自動的に関連付けられません! – anon

+0

素晴らしい、それは完璧に働いた、それのために、年齢のためにこれをやろうとしている! – knappster

関連する問題