9

मैं एमवीसी के साथ ईएफ कोड फर्स्ट का उपयोग करने के साथ शुरू कर रहा हूं और कुछ के साथ थोड़ा सा स्टंप कर रहा हूं। मैं निम्नलिखित db संरचना है (क्षमा करें, लेकिन मैं दुर्भाग्य से एक छवि पोस्ट करने के लिए अनुमति नहीं थी):ईएफ कोड सबसे पहले कई आत्म संदर्भ संबंधों के साथ

तालिका - उत्पादों
तालिका - RelatedProducts

Products.ProductID पर

1-कई -> RelatedProducts.ProductID
1- उत्पादों पर कई। उत्पादक -> संबंधित उत्पाद .संबंधित उत्पाद उत्पाद

असल में मेरे पास एक ऐसा उत्पाद है जिसमें उससे संबंधित उत्पादों की श्रृंखला हो सकती है। इन्हें संबंधित उत्पाद तालिका में उत्पाद आईडी द्वारा परिभाषित रिलेशनशिप और संबंधित उत्पाद के उत्पाद आईडी के साथ रखा गया है जिसे मैंने संबंधित प्रोडक्टिड नाम दिया है।

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

क्या क्या मैं गलत कर रहा हूँ? मैं मूल रूप से एक उत्पाद प्राप्त करना चाहता हूं, फिर संबंधित उत्पाद के माध्यम से पुन: प्रयास करें और उस उत्पाद की जानकारी प्रदर्शित करें।

उत्तर

9

उत्तर का पहला भाग यह है कि ईएफ 4 सीटीपी 5 डेटाबेस में आपके पीओसीओ को सही ढंग से मैप नहीं कर रहा है क्योंकि यह पर्याप्त स्मार्ट नहीं है। यदि आप डेटाबेस देखते हैं, तो आपको मिलते हैं:

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 के बीच संबंधों पर हटाना झरना नहीं कर सकते हैं सावधान रहें। यह ईएफ 4 की सीमा नहीं है: चक्रीय कैस्केडिंग डिलीट को रोकने के लिए इसकी आवश्यकता है। – anon

+0

यह भी ध्यान रखें कि रिश्ते सममित नहीं हैं। यदि product1 को उत्पाद 2 से संबंधित के रूप में जोड़ा गया है, तो उत्पाद 2 स्वचालित रूप से product1 से संबंधित नहीं है! – anon

+0

उत्कृष्ट, जो पूरी तरह से काम करता है, इसके लिए धन्यवाद, उम्र के लिए ऐसा करने की कोशिश कर रहा है! – knappster