c# – 实体框架:多对多关系中的重复记录

前端之家收集整理的这篇文章主要介绍了c# – 实体框架:多对多关系中的重复记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下实体框架代码第一个代码.创建表并插入数据.但是俱乐部表中有重复的记录.

我的业务是:

>使用俱乐部创建应用程序创建俱乐部
>使用人物应用程序创建人物

如何避免重复输入?

  1. static void Main(string[] args)
  2. {
  3. Database.SetInitializer<NerdDinners>(new MyInitializer());
  4.  
  5. CreateClubs();
  6. InsertPersons();
  7.  
  8. }
  9.  
  10. public static void CreateClubs()
  11. {
  12.  
  13. string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
  14. using (var db = new NerdDinners(connectionstring))
  15. {
  16.  
  17. Club club1 = new Club();
  18. club1.ClubName = "club1";
  19.  
  20. Club club2 = new Club();
  21. club2.ClubName = "club2";
  22.  
  23. Club club3 = new Club();
  24. club3.ClubName = "club3";
  25.  
  26. db.Clubs.Add(club1);
  27. db.Clubs.Add(club2);
  28. db.Clubs.Add(club3);
  29.  
  30. int recordsAffected = db.SaveChanges();
  31.  
  32.  
  33. }
  34. }
  35.  
  36. public static Club GetClubs(string clubName)
  37. {
  38. string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
  39. using (var db = new NerdDinners(connectionstring))
  40. {
  41.  
  42. //var query = db.Clubs.Where(p => p.ClubName == clubName);
  43. var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName);
  44. return query;
  45. }
  46. }
  47.  
  48. public static void InsertPersons()
  49. {
  50. string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
  51. using (var db = new NerdDinners(connectionstring))
  52. {
  53.  
  54. Club club1 = GetClubs("club1");
  55. Club club2 = GetClubs("club2");
  56. Club club3 = GetClubs("club3");
  57.  
  58. Person p1 = new Person();
  59. p1.PersonName = "Person1";
  60.  
  61. Person p2 = new Person();
  62. p2.PersonName = "Person2";
  63.  
  64. List<Club> clubsForPerson1 = new List<Club>();
  65. clubsForPerson1.Add(club1);
  66. clubsForPerson1.Add(club3);
  67.  
  68. List<Club> clubsForPerson2 = new List<Club>();
  69. clubsForPerson2.Add(club2);
  70. clubsForPerson2.Add(club3);
  71.  
  72. p1.Clubs = clubsForPerson1;
  73. p2.Clubs = clubsForPerson2;
  74.  
  75. db.Persons.Add(p1);
  76. db.Persons.Add(p2);
  77.  
  78. int recordsAffected = db.SaveChanges();
  79.  
  80.  
  81. }
  82. }

  1. public class Person
  2. {
  3. public int PersonId { get; set; }
  4. public string PersonName { get; set; }
  5. public virtual ICollection<Club> Clubs { get; set; }
  6. }
  7.  
  8. public class Club
  9. {
  10. public int ClubId { get; set; }
  11. public string ClubName { get; set; }
  12. public virtual ICollection<Person> Members { get; set; }
  13. }
  14.  
  15. //System.Data.Entity.DbContext is from EntityFramework.dll
  16. public class NerdDinners : System.Data.Entity.DbContext
  17. {
  18.  
  19. public NerdDinners(string connString): base(connString)
  20. {
  21.  
  22. }
  23.  
  24. protected override void OnModelCreating(DbModelBuilder modelbuilder)
  25. {
  26. //Fluent API - Plural Removal
  27. modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
  28. }
  29.  
  30. public DbSet<Person> Persons { get; set; }
  31. public DbSet<Club> Clubs { get; set; }
  32.  
  33. }

解决方法

问题是您创建更多的上下文.

首先你创建俱乐部.没关系.但是,当您创建人员时,您可以通过GetClubs获取俱乐部,但是对于每个俱乐部,您将处理实际的实体框架上下文,以便最终分离实体.在InsertPersons,你添加了离散的俱乐部实体给新的人,所以实际上下文会认为俱乐部是新的俱乐部.

所以当你为一个人添加一个俱乐部,你实际上创建了新的俱乐部.

这是因为实体框架跟踪更改并管理每个上下文的实体.如果您将实体添加到不包含它的上下文中,那么它将像新实体一样对待.

其实你应该这样做(未测试):

  1. static void Main(string[] args)
  2. {
  3. Database.SetInitializer<NerdDinners>(new MyInitializer());
  4.  
  5. string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30";
  6. using (var db = new NerdDinners(connectionstring))
  7. {
  8. CreateClubs(db);
  9. InsertPersons(db);
  10. }
  11.  
  12. }
  13.  
  14. public static void CreateClubs(NerdDinners db)
  15. {
  16. Club club1 = new Club();
  17. club1.ClubName = "club1";
  18.  
  19. Club club2 = new Club();
  20. club2.ClubName = "club2";
  21.  
  22. Club club3 = new Club();
  23. club3.ClubName = "club3";
  24.  
  25. db.Clubs.Add(club1);
  26. db.Clubs.Add(club2);
  27. db.Clubs.Add(club3);
  28.  
  29. int recordsAffected = db.SaveChanges();
  30. }
  31.  
  32. public static Club GetClubs(string clubName,NerdDinners db)
  33. {
  34. //var query = db.Clubs.Where(p => p.ClubName == clubName);
  35. var query = db.Clubs.SingleOrDefault(p => p.ClubName == clubName);
  36. return query;
  37. }
  38.  
  39. public static void InsertPersons(NerdDinners db)
  40. {
  41. Club club1 = GetClubs("club1",db);
  42. Club club2 = GetClubs("club2",db);
  43. Club club3 = GetClubs("club3",db);
  44.  
  45. Person p1 = new Person();
  46. p1.PersonName = "Person1";
  47.  
  48. Person p2 = new Person();
  49. p2.PersonName = "Person2";
  50.  
  51. List<Club> clubsForPerson1 = new List<Club>();
  52. clubsForPerson1.Add(club1);
  53. clubsForPerson1.Add(club3);
  54.  
  55. List<Club> clubsForPerson2 = new List<Club>();
  56. clubsForPerson2.Add(club2);
  57. clubsForPerson2.Add(club3);
  58.  
  59. p1.Clubs = clubsForPerson1;
  60. p2.Clubs = clubsForPerson2;
  61.  
  62. db.Persons.Add(p1);
  63. db.Persons.Add(p2);
  64.  
  65. int recordsAffected = db.SaveChanges();
  66. }

当然,你应该重构这个代码的结构,但请注意,我的操作只使用一个EF上下文.

猜你在找的C#相关文章