2012-08-01 6 views
21

मैं SQL सर्वर 2012 डेटाबेस के विरुद्ध इकाई फ्रेमवर्क 4.3.1 का उपयोग कर रहा हूं और मैं पॉको दृष्टिकोण का उपयोग कर रहा हूं। मैं निम्न त्रुटि हो रही है और यदि कोई इसे ठीक करने की व्याख्या कर सकते मैं सोच रहा हूँ:कैसे ठीक करें: रिश्ते की बाधा में निर्भर और प्रिंसिपल भूमिकाओं में संपत्तियों की संख्या समान होनी चाहिए?

ModelValidationException मॉडल पीढ़ी के दौरान

एक या अधिक सत्यापन त्रुटियों का पता चला गया: \ tSystem.Data .Entity.Edm.EdmAssociationConstraint:: रिश्ते की बाधा में निर्भर और प्रिंसिपल भूमिकाओं में गुणों की संख्या समान होना चाहिए।

कोई और जानकारी के लिए कोई InnerException उपलब्ध नहीं है।

मैं डेटाबेस स्कीमा बदल सकते हैं नहीं है और यह एक छोटे से अजीब है, लेकिन यहाँ यह है ...

  • ** हैं प्राथमिक कुंजी (नोटिस मैं समग्र प्राथमिक कुंजी)
  • (FK) इंगित करता है एक विदेशी कुंजी

यहाँ टेबल हैं (अगर यह मदद करता है मैं एसक्यूएल पोस्ट उन्हें उत्पन्न करने के लिए कर सकते हैं, लेकिन मुझे नहीं लगता कि टेबल वास्तव में समस्या के रूप में अपवाद मॉडल के सत्यापन में है):

public class Three 
{ 
    public int ThreeId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Two> Twos { get; private set; } 
    public virtual ICollection<One> Ones { get; private set; } 

    public void AddOne(One one) 
    { 
     if (one == null) 
      throw new ArgumentNullException("two"); 

     if (Ones == null) 
      Ones = new List<One>(); 

     if (!Ones.Contains(one)) 
      Ones.Add(one); 

     one.Three = this; 
    } 

    public void AddTwo(Two two) 
    { 
     if (two == null) 
      throw new ArgumentNullException("two"); 

     if (Twos == null) 
      Twos = new List<Two>(); 

     if (!Twos.Contains(two)) 
      Twos.Add(two); 

     two.Three = this; 
    } 
} 

public class Two 
{ 
    public int TwoId { get; set; } 
    public int ThreeId { get; set; } 
    public string Name { get; set; } 
    public virtual Three Three { get; set; } 
    public virtual ICollection<One> Ones { get; private set; } 

    public void AddOne(One one) 
    { 
     if (one == null) 
      throw new ArgumentNullException("two"); 

     if (Ones == null) 
      Ones = new List<One>(); 

     if (!Ones.Contains(one)) 
      Ones.Add(one); 

     one.Two = this; 
    } 
} 

public class One 
{ 
    public int OneId { get; set; } 
    public int TwoId { get; set; } 
    public int ThreeId { get; set; } 
    public virtual Two Two { get; set; } 
    public virtual Three Three { get; set; } 
} 

और यहाँ डेटा संदर्भ है::

public class DbCtx : DbContext 
{ 
    public DbCtx(string connectionString) 
     : base(connectionString) 
    { 
     Ones = Set<One>(); 
     Twos = Set<Two>(); 
     Threes = Set<Three>(); 
    } 

    public DbSet<One> Ones { get; private set; } 
    public DbSet<Two> Twos { get; private set; } 
    public DbSet<Three> Threes { get; private set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     var one = modelBuilder.Entity<One>(); 
     one.ToTable("One"); 

     one.HasKey(d => new 
          { 
           d.OneId, 
           d.TwoId, 
           d.ThreeId 
          }); 

     one.Property(d => d.OneId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     one.HasRequired(t => t.Two) 
      .WithMany(s => s.Ones) 
      .HasForeignKey(t => t.TwoId); 

     one.HasRequired(t => t.Three) 
      .WithMany(s => s.Ones) 
      .HasForeignKey(t => t.ThreeId); 

     var two = modelBuilder.Entity<Two>(); 
     two.ToTable("Two"); 

     two.HasKey(d => new 
          { 
           d.TwoId, 
           d.ThreeId 
          }); 

     two.Property(p => p.TwoId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     two.HasRequired(t => t.Three) 
      .WithMany(s => s.Twos) 
      .HasForeignKey(t => t.ThreeId); 

     var three = modelBuilder.Entity<Three>(); 
     three.ToTable("Three"); 
     three.HasKey(s => s.ThreeId); 

     three.Property(p => p.ThreeId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
One 
- 
**OneId int not null 
**TwoId int not null (FK) 
**ThreeId int not null (FK) 
Name nvarchar(50) not null 

Two 
- 
**TwoId int not null 
**ThreeId int not null (FK) 
Name nvarchar(50) not null 

Three 
- 
**ThreeId not null 
Name nvarchar(50) not null 

यहाँ संस्थाओं (है कि मैं मॉडल में विदेशी कुंजी शामिल कर रहा हूँ नोटिस लेकिन वह सुंदर मानक के अलावा अन्य) कर रहे हैं अंत में, यह अपवाद का कारण बनने के लिए कोड का एक स्निपेट है:

using (var ctx = new DbCtx(@".....")) 
{ 
    Console.WriteLine(ctx.Twos.Count()); 
} 

उत्तर

40

त्रुटि का कारण हैं आपके मॉडल में गलत तरीके से कॉन्फ़िगर किए गए संबंध। यह सही नहीं है:

one.HasRequired(t => t.Two) 
     .WithMany(s => s.Ones) 
     .HasForeignKey(t => t.TwoId); 

    one.HasRequired(t => t.Three) 
     .WithMany(s => s.Ones) 
     .HasForeignKey(t => t.ThreeId); 

यह होना चाहिए:

one.HasRequired(t => t.Two) 
     .WithMany(s => s.Ones) 
     .HasForeignKey(t => new { t.TwoId, t.ThreeId }); 

क्योंकि के आश्रित FK प्रिंसिपल पी के सभी स्तंभों होना चाहिए। आपको नेविगेशन प्रॉपर्टी को Three से One पर भी हटा देना होगा। के लिए

+1

ग्रेट, धन्यवाद - मैं थोड़ी देर के लिए उसके सिर पर टक्कर लगी थी! – kmp

1

नोट EF5 +: .HasForeignKey से एफई 5 पदावनत किया गया है: उपलब्ध तरीकों (https://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.configuration.manytomanyassociationmappingconfiguration_methods(v=vs.103).aspx) की सूची - MapLeftKey - MapRightKey - ToTable

एक कई करने के लिए कई की जरूरत है तो जहां एक 'बहुत से 'एक CompositeKey के साथ एक इकाई के लिए है:

one.HasKey(t => new { t.TwoId, t.ThreeId }); 
one.HasRequired(t => t.Two) 
    .WithMany(s => s.Ones) 
    .Map(m=>m.MapLeftKey("OneId").MapRIghtKey(new string[]{"TwoId", "ThreeId"})) 
1

यह भी Code first from Database की वजह से हो सकता है।

मेरे पास कई विचार थे जो मैंने लाया था जिसमें एंटीटी फ्रेमवर्क सम्मेलनों के अनुसार एक स्पष्ट कुंजी फ़ील्ड नहीं था। उत्पन्न कोड गलत क्षेत्र पर [Key] विशेषता डाल दिया। वास्तव में, यह किसी विशिष्टता का पता नहीं लगा सका, इसलिए यह सभी क्षेत्रों में [Key] विशेषता रखता है।

मैं त्रुटि को दूर करने के लिए सभी अतिरिक्त महत्वपूर्ण विशेषताओं को हटाने में सक्षम था।

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

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