长话短说:使用外键可以节省您的时间。
假设您有一个School实体和一个City实体,这是一个多对一关系,其中一个City有许多学校,而School属于一个City。并假定城市已经存在于查找表中,因此您不希望在插入新学校时再次插入城市。
最初,您可以这样定义实体:
public class City
{
public int Id { get; set; }
public string Name { get; set; }
}
public class School
{
public int Id { get; set; }
public string Name { get; set; }
[Required]
public City City { get; set; }
}
您可以像这样进行School插入(假设您已经将City属性分配给newItem):
public School Insert(School newItem)
{
using (var context = new DatabaseContext())
{
context.Set<School>().Add(newItem);
// use the following statement so that City won't be inserted
context.Entry(newItem.City).State = EntityState.Unchanged;
context.SaveChanges();
return newItem;
}
}
在这种情况下,上面的方法可能会完美地工作,但是,我更喜欢外键方法,该方法对我来说更清晰,更灵活。请参阅下面的更新的解决方案:
public class City
{
public int Id { get; set; }
public string Name { get; set; }
}
public class School
{
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("City_Id")]
public City City { get; set; }
[Required]
public int City_Id { get; set; }
}
这样,您可以明确定义School具有外键City_Id,并且它引用City实体。因此,在插入School时,您可以执行以下操作:
public School Insert(School newItem, int cityId)
{
if(cityId <= 0)
{
throw new Exception("City ID no provided");
}
newItem.City = null;
newItem.City_Id = cityId;
using (var context = new DatabaseContext())
{
context.Set<School>().Add(newItem);
context.SaveChanges();
return newItem;
}
}
在这种情况下,您明确指定City_Id的新记录,并删除了市从曲线图,使EF不会打扰到它一起添加到上下文学校。
尽管乍一看外键方法似乎更复杂,但是请相信我,这种心态将在插入多对多关系时为您节省很多时间(假设您有学校和学生的关系,而学生拥有City属性)等等。
希望这对您有帮助。