C# 在插入新的父对象时,是否阻止EF添加新的子对象而不仅仅是关联?
我有以下资料:C# 在插入新的父对象时,是否阻止EF添加新的子对象而不仅仅是关联?,c#,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,我有以下资料: public int CreateExercise(Exercise newExercise) { db.Exercises.Add(newExercise); db.SaveChanges(); return newExercise.ExerciseId; } 其中练习如下: public class Exercise { public Exercise() { Users = new
public int CreateExercise(Exercise newExercise) {
db.Exercises.Add(newExercise);
db.SaveChanges();
return newExercise.ExerciseId;
}
其中练习如下:
public class Exercise {
public Exercise() {
Users = new Collection<User>();
}
[Key]
[Required]
public int ExerciseId { get; set; }
[StringLength(300, ErrorMessage = "The value cannot exceed 300 characters. ")]
public string Title { get; set; }
public virtual ICollection<User> Users{ get; set; }
}
公开课练习{
公众活动({
用户=新集合();
}
[关键]
[必需]
public int ExerciseId{get;set;}
[StringLength(300,ErrorMessage=“该值不能超过300个字符。”)]
公共字符串标题{get;set;}
公共虚拟ICollection用户{get;set;}
}
当我创建一个新的练习时,有时会有预先存在的用户,包括Id。即使为这些用户
指定了现有的用户ID
,这里也会添加新的用户
条目。我只想添加关联,而不是新用户——我想EF足够聪明,可以解决这个问题吗?我做错了什么
我只是想尽量避免在附加到新练习的所有用户之间循环,在添加前清除它们,确保它们存在,添加练习,然后添加每个用户,最后调用
SaveChanges
重新连接断开连接的实体时,默认情况下它们处于添加状态
可以在附加练习后更改状态
public int CreateExercise(Exercise newExercise) {
db.Exercises.Add(newExercise);
// set all attached users to unchanged.
db.ChangeTracker.Entries<User>().ToList().ForEach(p => p.State = EntityState.Unchanged);
db.SaveChanges();
return newExercise.ExerciseId;
}
public int CreateExercise(Exercise newExercise){
db.Exercises.Add(newExercise);
//将所有连接的用户设置为“未更改”。
db.ChangeTracker.Entries().ToList().ForEach(p=>p.State=EntityState.Unchanged);
db.SaveChanges();
返回newExercise.ExerciseId;
}
如何创建和初始化练习
实例?EF不会只是将相关项添加到新实体中,除非是您所做的某件事导致了它。@AndrewBarber正在从客户端序列化它,以及关联的、预先存在的usersAhh;我误解了你。我手头上没有,但这样做是有问题的。您正在执行一个Add()
,因此,除非您告诉EF一些不同的内容,否则它假定需要将整个对象图作为新项目添加到数据库中-如果这些其他实体未被跟踪。您可以做一些事情来指示不添加相关记录,而只是关联。。。别忘了马上。。。