我有这个模特课:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Collection1 { get; set; } = new List<User>();
public virtual ICollection<User> Collection2 { get; set; } = new List<User>();
}
然后我在数据库中添加了一些记录:
var context = new UsersContext();
var user1 = new User();
var user2 = new User();
var user3 = new User();
user1.Name = "user1";
user2.Name = "user2";
user3.Name = "user3";
user1.Collection1.Add(user2);
user2.Collection1.Add(user3);
context.Users.Add(user1);
context.Users.Add(user2);
context.Users.Add(user3);
context.SaveChanges();
然后我运行这个查询:
var user2 = context.Users.First(user => user.Name == "user2");
foreach (var u in user2.Collection2)
Console.WriteLine($"{user2.Name} Collection2 {u.Name}");
我得到了:
user2 Collection2 user1
为什么在Collection2
我有记录?以及如何解决它?
更新
这是测试项目https://drive.google.com/file/d/0BxP-1gZwSGL5S1c4cWN1Q2NsYVU/view
的链接答案 0 :(得分:4)
这并不奇怪,但预期的行为。
考虑以下模型:
public class Entity1
{
public int Id { get; set; }
public ICollection<Entity2> Collection2 { get; set; }
}
public class Entity2
{
public int Id { get; set; }
public ICollection<Entity1> Collection1 { get; set; }
}
这是与隐式联结表的典型EF many-to-many
关系。当您将entity1
添加到entity2.Collection1
时,它还会将entity2
添加到entity1.Collection2
。
现在替换Entity1 = Entity2 = User
。结果就是你的模型。
很快,使用该模型,EF通过隐式many-to-many
联结表创建自UsersUsers
关系,这就是您获得所述行为的原因。
由于您的意图似乎有两个one-to-many
关系,因此您需要使用Fluent API明确告知EF:
public class UsersContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(e => e.Collection1).WithOptional();
modelBuilder.Entity<User>().HasMany(e => e.Collection2).WithOptional();
}
}
现在一切都会按预期工作。