我有一个asp.net-mvc项目,设置如下:
class Person {
int PersonId {get; set;}
List<Activity> Activities {get; set;}
}
class Activity {
int ActivityId {get; set;}
int PersonId {get; set;}
[ForeignKey("PersonId")]
Person Person {get; set;}
}
现在,当我为一个人添加一个新活动时,我发送了一个ajax POST,action方法执行以下操作:
public ActionResult AddActivity(int Id) {
var activity = new Activity();
activity.PersonId = Id;
db.Activity.Add(activity);
db.SaveChanges();
}
这是添加活动的一种坏方法,因为我手动添加了foregin密钥?
有没有办法做到这一点,而不必提供PersonId
外键并让它自动生成(可能获取person对象,更新其活动列表,然后将其标记为EntityState.Modified
)?
答案 0 :(得分:1)
这完全合法。
当您创建实体的新实例时,EF无法预先知道外键需要的值,只有在您将对象保存回来之前指定一个值时,它才会关注它是否有效到数据库。
想象一下,你有多个外键......你还会如何分配它们?!
您可以尝试将EF对象添加到父集合属性,但这样做不会更新关联的外键。这有点意义,但是再次出现了多个外键的问题。