EF Code The first display for the collection

First I use the RC code EF 4.1. I have many, many relationships working with a composite PC in the friends contact table. We clearly need a separate class of friends (we don’t ask), which represents our connection table. Our goal is to manage the removal process from the User object. Please read this before reading the rest: http://mocella.blogspot.com/2010/01/entity-framework-v4-object-graph.html . Thus, we managed to create our composite PC, but this violated our comparison for the collection. The question is how to match FriendsCol?

public class User { public int UserId { get; set; } public string Name { get; set; } public virtual ICollecion<Friends> FriendsCol { get; set; } } public class Friends { public int User1Id { get; set; } public int User2Id { get; set; } public User User1 { get; set; } public User User2 { get; set; } } 

Contains a composite key mapping

 public class FriendsMap : EntityTypeConfiguration<Friends> { HasKey(m => new { m.userId1 , m.userId2 }); //this.HasRequired(x => x.User1) //.WithMany() //.HasForeignKey(x => x.User1Id) //.WillCascadeOnDelete(false); //this.HasRequired(x => x.User2) // .WithMany() // .HasForeignKey(x => x.User2Id) // .WillCascadeOnDelete(false); } public class UserMap : EntityTypeConfiguration<UserNew> { public UserMap() { ToTable("users"); Property(user => user.Name).HasColumnName("name"); // HasMany<Friends>(user => user.FriendsCol).WithMany(); } } 
+4
source share
3 answers

How about this:

 public class FriendsMap : EntityTypeConfiguration<Friends> { HasKey(m => new { m.userId1 , m.userId2 }); this.HasRequired(x => x.User1) .WithMany() .HasForeignKey(x => x.User1Id) .WillCascadeOnDelete(false); this.HasRequired(x => x.User2) .WithMany(u => u.FriendsCol) .HasForeignKey(x => x.User2Id) .WillCascadeOnDelete(false); } public class UserMap : EntityTypeConfiguration<UserNew> { public UserMap() { ToTable("users"); Property(user => user.Name).HasColumnName("name"); } } 

Edit:

I just made a very simple example and it works without problems:

 class Program { static void Main(string[] args) { using (var context = new Context()) { context.Database.Delete(); context.Database.CreateIfNotExists(); var u1 = new User() { Name = "A" }; var u2 = new User() { Name = "B" }; var u3 = new User() { Name = "C" }; var f1 = new Friends() { User1 = u1, User2 = u2}; var f2 = new Friends() { User1 = u1, User2 = u3 }; context.Friends.Add(f1); context.Friends.Add(f2); context.SaveChanges(); } } } public class User { public int UserId { get; set; } public string Name { get; set; } public virtual ICollection<Friends> FriendsCol { get; set; } } public class Friends { public int User1Id { get; set; } public int User2Id { get; set; } public User User1 { get; set; } public User User2 { get; set; } } public class Context : DbContext { public DbSet<User> Users { get; set; } public DbSet<Friends> Friends { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Friends>() .HasKey(m => new { m.User1Id, m.User2Id }); modelBuilder.Entity<Friends>() .HasRequired(x => x.User1) .WithMany() .HasForeignKey(x => x.User1Id) .WillCascadeOnDelete(false); modelBuilder.Entity<Friends>() .HasRequired(x => x.User2) .WithMany(u => u.FriendsCol) .HasForeignKey(x => x.User2Id) .WillCascadeOnDelete(false); } } 
+1
source

Ok, here's what should happen:

 class Program { static void Main(string[] args) { int id1; int id2; using (var context = new Context()) { context.Database.Delete(); context.Database.CreateIfNotExists(); var u1 = new User() { Name = "A" }; var u2 = new User() { Name = "B" }; var u3 = new User() { Name = "C" }; var f1 = new Friends() { User1 = u1, User2 = u2 }; var f2 = new Friends() { User1 = u1, User2 = u3 }; u1.FriendsCol.Add(f1); u1.FriendsCol.Add(f2); context.SaveChanges(); id1 = u1.Id; id2 = u2.Id; } using (var context = new Context()) { var u1 = context.Users.Find(id1); var friendsToRemove = u1.FriendsCol.Where(f => f.User2.Id == id2).ToList(); foreach (var friend in friendsToRemove) { u1.FriendsCol.Remove(friend); } context.SaveChanges(); } } } public class User { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<Friends> FriendsCol { get; set; } public User() { FriendsCol = new List<Friends>(); } } public class Friends { public int User1Id { get; set; } public int User2Id { get; set; } public User User1 { get; set; } public User User2 { get; set; } } public class Context : DbContext { public DbSet<User> Users { get; set; } public DbSet<Friends> Friends { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Friends>() .HasKey(m => new { m.User1Id, m.User2Id }); modelBuilder.Entity<Friends>() .HasRequired(x => x.User1) .WithMany() .HasForeignKey(x => x.User1Id); modelBuilder.Entity<Friends>() .HasRequired(x => x.User2) .WithMany(u => u.FriendsCol) .HasForeignKey(x => x.User2Id); } } 
+1
source

It also fails to delete related objects. And this is a mistake: * The link from the "Order_Lines" AssociationSet is in the "Deleted" state. Given the limitations of plurality, the corresponding Order_Lines_Target must also be in the Deleted state. *

 class Program { static void Main(string[] args) { int orderid1; int Lineid2; using (var context = new Context()) { var u1 = new Order() { Name = "A" }; var l1 = new OrderLine() { Name = "L1" }; var l2 = new OrderLine() { Name = "L2" }; u1.Lines.Add(l1); u1.Lines.Add(l2); context.Orders.Add(u1); context.SaveChanges(); Orderid1 = u1.Id; Lineid2 = l2.Id; } using (var context = new Context()) { var u1 = context.Orders.Find(Orderid1); foreach (var item in u1.Lines) { if (item.Id == Lineid2) { u1.Lines.Remove(item); break; } } context.SaveChanges(); } } } public class OrderLine { public int Id { get; set; } public string Name { get; set; } public Order Order { get; set; } } public class Order { public int Id { get; set; } public string Name { get; set; } public virtual ICollection<OrderLine> Lines { get; set; } public Order() { Lines = new List<OrderLine>(); } } public class Context : DbContext { public DbSet<Order> Orders { get; set; } public DbSet<OrderLine> OrderLiness { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Order>().HasMany<OrderLine>(o => o.Lines).WithRequired(l => l.Order); } } 
+1
source

Source: https://habr.com/ru/post/1345704/


All Articles