2012-07-25 20 views
10

मेरे पास निम्न इकाई फ्रेमवर्क कोड पहला कोड है। टेबल बनाए जाते हैं और डेटा डाला जाता है। हालांकि क्लब टेबल में डुप्लिकेट रिकॉर्ड हैं।इकाई फ्रेमवर्क: कई से कई रिश्ते में डुप्लिकेट रिकॉर्ड्स

मेरे संचालन कर रहे हैं: -

  1. क्लब सृजन एप्लिकेशन

  2. बनाएं व्यक्तियों व्यक्ति एप्लिकेशन

का उपयोग कर कैसे डुप्लिकेट प्रविष्टि का उपयोग कर से बचने के लिए क्लब बनाएँ?

enter image description here

static void Main(string[] args) 
    { 
     Database.SetInitializer<NerdDinners>(new MyInitializer()); 

     CreateClubs(); 
     InsertPersons(); 

    } 

    public static void CreateClubs() 
    { 

     string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; 
     using (var db = new NerdDinners(connectionstring)) 
     { 

      Club club1 = new Club(); 
      club1.ClubName = "club1"; 

      Club club2 = new Club(); 
      club2.ClubName = "club2"; 

      Club club3 = new Club(); 
      club3.ClubName = "club3"; 

      db.Clubs.Add(club1); 
      db.Clubs.Add(club2); 
      db.Clubs.Add(club3); 

      int recordsAffected = db.SaveChanges(); 


     } 
    } 

    public static Club GetClubs(string clubName) 
    { 
     string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; 
     using (var db = new NerdDinners(connectionstring)) 
     { 

      //var query = db.Clubs.Where(p => p.ClubName == clubName); 
      var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName); 
      return query; 
     } 
    } 

    public static void InsertPersons() 
    { 
     string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; 
     using (var db = new NerdDinners(connectionstring)) 
     { 

      Club club1 = GetClubs("club1"); 
      Club club2 = GetClubs("club2"); 
      Club club3 = GetClubs("club3"); 

      Person p1 = new Person(); 
      p1.PersonName = "Person1"; 

      Person p2 = new Person(); 
      p2.PersonName = "Person2"; 

      List<Club> clubsForPerson1 = new List<Club>(); 
      clubsForPerson1.Add(club1); 
      clubsForPerson1.Add(club3); 

      List<Club> clubsForPerson2 = new List<Club>(); 
      clubsForPerson2.Add(club2); 
      clubsForPerson2.Add(club3); 

      p1.Clubs = clubsForPerson1; 
      p2.Clubs = clubsForPerson2; 

      db.Persons.Add(p1); 
      db.Persons.Add(p2); 

      int recordsAffected = db.SaveChanges(); 


     } 
    } 

डोमेन

public class Person 
{ 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
    public virtual ICollection<Club> Clubs { get; set; } 
} 

public class Club 
{ 
    public int ClubId { get; set; } 
    public string ClubName { get; set; } 
    public virtual ICollection<Person> Members { get; set; } 
} 

//System.Data.Entity.DbContext is from EntityFramework.dll 
public class NerdDinners : System.Data.Entity.DbContext 
{ 

    public NerdDinners(string connString): base(connString) 
    { 

    } 

    protected override void OnModelCreating(DbModelBuilder modelbuilder) 
    { 
     //Fluent API - Plural Removal 
     modelbuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 

    public DbSet<Person> Persons { get; set; } 
    public DbSet<Club> Clubs { get; set; } 

} 
+1

आप इसे दो बार चलाई? – podiluska

+0

@ पॉडिलुस्का। नहीं, मैंने इसे केवल एक बार भाग लिया। – Lijo

उत्तर

18

समस्या यह है कि आप और अधिक संदर्भों का निर्माण है।

सबसे पहले आप क्लब बनाते हैं। यह ठीक है। लेकिन जब आप व्यक्ति बनाते हैं, तो आप GetClubs के माध्यम से क्लब लाते हैं, लेकिन प्रत्येक क्लब के लिए आप वास्तविक इकाई ढांचे के संदर्भ का निपटान करते हैं ताकि आप अलग-अलग इकाइयों के साथ समाप्त हो जाएं। InsertPersons पर आप नए लोगों को अलग क्लब इकाइयों को जोड़ते हैं ताकि वास्तविक संदर्भ यह सोच सके कि क्लब नए क्लब हैं।

तो जब आप किसी व्यक्ति को क्लब जोड़ते हैं तो आप वास्तव में नए क्लब बनाते हैं।

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

static void Main(string[] args) 
{ 
    Database.SetInitializer<NerdDinners>(new MyInitializer()); 

    string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; 
    using (var db = new NerdDinners(connectionstring)) 
    { 
     CreateClubs(db); 
     InsertPersons(db); 
    } 

} 

public static void CreateClubs(NerdDinners db) 
{ 
    Club club1 = new Club(); 
    club1.ClubName = "club1"; 

    Club club2 = new Club(); 
    club2.ClubName = "club2"; 

    Club club3 = new Club(); 
    club3.ClubName = "club3"; 

    db.Clubs.Add(club1); 
    db.Clubs.Add(club2); 
    db.Clubs.Add(club3); 

    int recordsAffected = db.SaveChanges(); 
} 

public static Club GetClubs(string clubName, NerdDinners db) 
{ 
    //var query = db.Clubs.Where(p => p.ClubName == clubName); 
    var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName); 
    return query; 
} 

public static void InsertPersons(NerdDinners db) 
{ 
    Club club1 = GetClubs("club1", db); 
    Club club2 = GetClubs("club2", db); 
    Club club3 = GetClubs("club3", db); 

    Person p1 = new Person(); 
    p1.PersonName = "Person1"; 

    Person p2 = new Person(); 
    p2.PersonName = "Person2"; 

    List<Club> clubsForPerson1 = new List<Club>(); 
    clubsForPerson1.Add(club1); 
    clubsForPerson1.Add(club3); 

    List<Club> clubsForPerson2 = new List<Club>(); 
    clubsForPerson2.Add(club2); 
    clubsForPerson2.Add(club3); 

    p1.Clubs = clubsForPerson1; 
    p2.Clubs = clubsForPerson2; 

    db.Persons.Add(p1); 
    db.Persons.Add(p2); 

    int recordsAffected = db.SaveChanges(); 
} 
बेशक

आप इस कोड की संरचना refactor चाहिए, लेकिन कृपया ध्यान दें कि मैं अपने कार्यों के लिए केवल एक ही एफई संदर्भ का उपयोग करें:

असल में, आप कुछ इस तरह (नहीं परीक्षण किया) करना चाहिए।

+0

मेरे संपादन और कोड नमूना देखें –

+0

उस कोड नमूने में, केवल एक ईएफ संदर्भ है। मुझे अलग ईएफ संदर्भों की आवश्यकता है। कोई विचार? – Lijo

+1

यदि आप वास्तविक संदर्भ की तुलना में विभिन्न स्रोतों से इकाइयों का उपयोग करना चाहते हैं तो आपको उन्हें संलग्न करने की आवश्यकता है: http://msdn.microsoft.com/en-us/library/bb896271.aspx –

0

@PeterPorfy

के लिए धन्यवाद भी पढ़ Exception of type 'System.ObjectDisposedException'

मैं

((IObjectContextAdapter)db).ObjectContext.Attach((IEntityWithKey)entity); 

इस्तेमाल किया पिछले संदर्भ से वस्तुओं संलग्न करने के लिए।

आईएनटीटीआईथकी के लिए एक उदाहरण मैंने निम्नानुसार उपयोग किया है। यदि आप इस दृष्टिकोण के साथ कोई समस्या देखते हैं तो कृपया टिप्पणी करें।

public class Person : IEntityWithKey 
{ 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 

    public EntityKey EntityKey { get; set; } 
} 

निम्नलिखित देखें भी

  1. Problem with SaveChanges() Entity Framework 4.1
  2. Entity Framework Updating Many-To-Many Relationships - POCO

+0

जो लोग डाउनवोट करते हैं - मुझे रूचि है यह देखने के लिए कि एक डाउनवोट क्यों है। क्या इस उत्तर में कुछ गड़बड़ है? – Lijo

+0

मुझे लगता है कि वे पीटर के जवाब को सही के रूप में चिह्नित करने के लिए पसंद करते हैं। बस केह रहा हू। – Miro

+0

मैंने डाउनवॉट नहीं किया है। – Miro

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