2010-09-22 10 views
6

मेरे पास निम्न सेटअप है (जो ठीक काम करता है)। CodeFirst (सीटीपी 4) का उपयोग करना।डबल जंक्शन टेबल्स के बिना कई रिश्तों में से कई, इकाई फ्रेमवर्क

एक टेम्पलेट में प्रभावों की एक सूची है, प्रत्येक प्रभाव एक विशेषता के लिए एक मूल्य देता है।

public class Template 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<Influence> Influences { get; set; } 
} 

public class Influence 
{ 
    public virtual int Id { get; set; } 
    public virtual Trait Trait { get; set; } 
    public virtual int Value { get; set; } 
} 

public class Trait 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

टेम्पलेट इस तरह कॉन्फ़िगर किया गया है।

public class TemplateConfiguration : EntityConfiguration<Template> 
{ 
    public TemplateConfiguration() 
    { 
     HasKey(o => o.Id); 
     Property(o => o.Id).IsIdentity(); 

     HasMany(o => o.Influences).WithRequired() 
      .Map("templates.influences", 
      (template, influence) => new { 
       Template = template.Id, 
       Influence = influence.Id 
      }); 
     MapSingleType(o => new { 
      o.Id 
     }); 
    } 
} 

यह काम करता है लेकिन मैं नहीं बल्कि अतिरिक्त 'प्रभावों' तालिका से बचने चाहते हैं। अनिवार्य रूप से, 'प्रभाव' बस एक वस्तु है और उनके लिए केंद्रीय स्टोर होने की आवश्यकता नहीं है। असल में, यह डिजाइन के लिए अधिक फायदेमंद है कि मैं उनसे संपर्क करने की कोशिश कर रहा हूं यदि उनके लिए केंद्रीय तालिका नहीं है।

मैं टेम्पलेट तालिका के लिए इस तरह का एक परिदृश्य स्थापित करना चाहता हूं ... मूल रूप से प्रभाव की अपनी तालिका नहीं है, वे केवल ट्रैट/वैल्यू द्वारा मैप किए जाते हैं जहां उनका उपयोग किया जाता है।

public TemplateConfiguration() 
    { 
     HasMany(u => u.Influences).WithMany() 
      .Map("templates.influences", 
      (template, influence) => new { 
       Template = template.Id, 
       Trait = influence.Trait.Id, 
       Value = influence.Value 
      }); 

     MapSingleType(c => new { 
      c.Id 
     }).ToTable("templates"); 
    } 

जब मैं इसे इस तरह से करने का प्रयास करता हूं, तो मुझे टेम्पलेट मैपिंग पर अपवाद मिलता है।

System.InvalidOperationException बिना क्रिया

दिया अभिव्यक्ति को किसी अज्ञात पैटर्न शामिल था 'influence.Trait.Id'।


नीचे पूरी परियोजना कोड, यदि आवश्यक हो तो है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Objects; 
using System.Data.EntityClient; 
using System.Data.Entity.ModelConfiguration; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

namespace EFTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
        Database.SetInitializer<SampleDataContext>(new AlwaysRecreateDatabase<SampleDataContext>()); 
      var builder = new ModelBuilder(); 

      builder.Configurations.Add(new TraitConfiguration()); 
      builder.Configurations.Add(new InfluenceConfiguration()); 
      builder.Configurations.Add(new TemplateConfiguration()); 

      var model = builder.CreateModel(); 

      using (var context = new SampleDataContext(model)) 
      { 
       var traits = new List<Trait> 
       { 
        new Trait { Name = "Years" }, 
        new Trait { Name = "Days" } 
       }; 
       traits.ForEach(x => { context.Traits.Add(x); }); 
       context.SaveChanges(); 

       var templates = new List<Template> 
       { 
        new Template 
        { 
         Influences = new List<Influence> 
         { 
          new Influence 
          { 
           Trait = context.Traits.Single(i => i.Name == "Years"), 
           Value = 5 
          }, 
          new Influence 
          { 
           Trait = context.Traits.Single(i => i.Name == "Days"), 
           Value = 15 
          } 
         } 
        } 
       }; 
       templates.ForEach(x => { context.Templates.Add(x); }); 
       context.SaveChanges(); 
      } 
     } 
    } 

    public class SampleDataContext : DbContext 
    { 
     public SampleDataContext(DbModel model) 
      : base(model) 
     { 
     } 

     public DbSet<Trait> Traits { get; set; } 
     public DbSet<Influence> Influences { get; set; } 
     public DbSet<Template> Templates { get; set; } 
    } 

    public class Trait 
    { 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
    } 

    public class TraitConfiguration : EntityConfiguration<Trait> 
    { 
     public TraitConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      MapSingleType(o => new { 
       o.Id, 
       o.Name 
      }); 
     } 
    } 

    public class Influence 
    { 
     public virtual int Id { get; set; } 
     public virtual Trait Trait { get; set; } 
     public virtual int Value { get; set; } 
    } 

    public class InfluenceConfiguration : EntityConfiguration<Influence> 
    { 
     public InfluenceConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      HasRequired(o => o.Trait); 
      Property(o => o.Value); 

      MapSingleType(o => new { 
       o.Id, 
       Trait = o.Trait.Id, 
       o.Value 
      }); 
     } 
    } 

    public class Template 
    { 
     public virtual int Id { get; set; } 
     public virtual ICollection<Influence> Influences { get; set; } 
    } 

    public class TemplateConfiguration : EntityConfiguration<Template> 
    { 
     public TemplateConfiguration() 
     { 
      HasKey(o => o.Id); 
      Property(o => o.Id).IsIdentity(); 

      HasMany(o => o.Influences).WithRequired() 
       .Map("templates.influences", 
       (template, influence) => new { 
        Template = template.Id, 
        Influence = influence.Id 
       }); 
      MapSingleType(o => new { 
       o.Id 
      }); 
     } 
    } 
} 
+0

किसी को भी? कृप्या? यह वास्तव में मुझे पागल गाड़ी चला रहा है। – Ciel

+1

यदि आप एक बेहद छोटा और सरल कोड स्निपेट पोस्ट करते हैं तो आपको अधिक प्रतिक्रियाएं मिलेंगी जो आपके पास वर्तमान में मौजूद विशाल मात्रा में कोड की बजाय समस्या को अपने न्यूनतम रूप में कैप्चर करती है। साथ ही, जब आप कहते हैं "यह मुझे त्रुटियां देता है", तो आप _must_ में पूर्ण त्रुटि/अपवाद टेक्स्ट शामिल करते हैं, अन्यथा यह "यह काम नहीं करता" कहने के बराबर है। –

+2

आमतौर पर, जब मैं केवल आवश्यक पोस्ट करता हूं, तो मुझे लोगों को शिकायत होती है कि मैं किसी भी उपयोग के लिए पर्याप्त कोड प्रदान नहीं कर रहा हूं। तो इस बार मैंने अभी पूरी परियोजना पोस्ट की है। मैंने इसे अधिक संक्षेप में संपादित किया है, और किसी संदर्भ के लिए नीचे दिए गए पूर्ण कोड को छोड़ दिया है। – Ciel

उत्तर

1

ठीक है, नया दिन नया विचार।

मैंने अब सीटीपी 4 स्थापित किया है और आपको मिलते-जुलते 4 टेबल मिल गए हैं।

कई कारणों से कई संबंधों का उत्पादन क्यों किया जाता है, यह मॉडल यह नहीं जानता कि एक प्रभाव केवल एक टेम्पलेट द्वारा उपयोग किया जाएगा। तो फिर तुम यह बताने के लिए है कि:

public class Influence 
{ 
    public virtual int Id { get; set; } 
    public virtual Trait Trait { get; set; } 
    public virtual int Value { get; set; } 
    public virtual Template Template { get; set; } 
} 

और:

public InfluenceConfiguration() 
    { 
     HasKey(o => o.Id); 
     Property(o => o.Id).IsIdentity(); 
     Property(o => o.Value); 

     MapSingleType(o => new 
     { 
      o.Id, 
      Trait = o.Trait.Id, 
      o.Value, 
      Template = o.Template.Id 
     }); 
    } 

प्रभावों तालिका तो इस तरह दिखेगा:

CREATE TABLE [dbo].[Influences](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Template] [int] NULL, 
    [Trait] [int] NULL, 
    [Value] [int] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Influences] WITH CHECK ADD CONSTRAINT [Influence_Template] FOREIGN KEY([Template]) 
REFERENCES [dbo].[Templates] ([Id]) 
GO 

ALTER TABLE [dbo].[Influences] CHECK CONSTRAINT [Influence_Template] 
GO 

ALTER TABLE [dbo].[Influences] WITH CHECK ADD CONSTRAINT [Influence_Trait] FOREIGN KEY([Trait]) 
REFERENCES [dbo].[Traits] ([Id]) 
GO 

ALTER TABLE [dbo].[Influences] CHECK CONSTRAINT [Influence_Trait] 
GO 
+0

तो मैं इसके बारे में क्या कर सकता हूं? प्रभाव वस्तु को किसी ऑब्जेक्ट के रूप में C# में मौजूद होना आवश्यक है, लेकिन डेटाबेस में किसी इकाई के रूप में नहीं। – Ciel

+1

@ शिरज़ - मुझे लगता है कि आप पीछे की तरफ हैं। वह टेम्पलेट-> डेटाबेस में विशेषता चाहता है, और टेम्पलेट-> प्रभाव-> अधिकारों में विशेषता –

+0

हाँ, मुझे लगता है कि वह मेरे प्रश्न को गलत समझ रहा है। – Ciel

संबंधित मुद्दे