我有一个Movies
的json对象,我正在传递给我的控制器。
{data : [{
Id: 12345,
Title: 'Movie1',
Year: 2010,
Character: [{
Name: 'Character1',
Person: { Id: 1, Name: 'Person1' }
},{
Name: 'Character2',
Person: { Id: 2, Name: 'Person2' }
}]
}]}
模型绑定工作正常但我在通过Entity Framework 5将每个Movie
插入数据库时遇到问题。当电影的每个Person
出现时,我发现主键违规插入。
我明白为什么会这样。添加新Movie
时,数据库中已存在某些人,因此发生了违规。不会自动生成每个人的ID。我正在使用从api收到的ID我从中获取信息。
Movie
与Person
有多对多关系,Character
是两者之间的桥梁。
public class Movie {
public int Id { get; set; }
public string Title { get; set; }
public int? Year { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Movie() {
Characters = new HashSet<Character>();
}
}
public class Character {
public string Name { get; set; }
public virtual Movie Movie { get; set; }
public virtual Person Person { get; set; }
}
public class Person {
public int Id { get;set; }
public string Name { get; set; }
public virtual ICollection<Character> Characters { get; set; }
public Person() {
Characters = new HashSet<Character>();
}
}
我的问题是......我知道我可以遍历每个Person
对象和Attach()
(如果存在)或Add()
(如果不存在)。 可以实体框架自动处理插入新Person
并忽略它(如果它已经存在)?如果没有,这类问题的最佳做法是什么?
答案 0 :(得分:0)
我认为如果Person对象已经存在,则无需附加它们。
我要做的是遍历API Person对象并与EF DbContext进行比较。
var dbPerson = MyMovieContext.Persons.Where(x => x.ID == myPersonID).SingleOrDefault();
如果找不到匹配项,请单击“添加”。如果找到匹配项,则将DbContext中的Character上的引用替换为Entity。
答案 1 :(得分:0)
如果您使用DbContext API,则可以使用AddOrUpdate
扩展方法。假设你有一个或多个人,那么你可以这样做:
context.Persons.AddOrUpdate(persons.ToArray());
您可能会为每个模型项执行此操作(persons
是项目的人员),然后创建附加了Character
和Person
个对象的Movie
个对象。< / p>
请注意,AddOrUpdate
仅在上下文中添加或更新。只有SaveChanges
提交到数据库。