我正在使用带有代码优先方法的 Entity Framework 5。
我有两个彼此具有多对多关系的类,Movie
并且Person
. A通过 aMovie
与 a 相关。每个都可以有多个字符。Person
Character
Movie
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>();
}
}
有时一个Movie
可以有一个Person
播放多个Character
。在这种情况下尝试添加时遇到问题Movie
...
假设 Movie1 有 2 个角色都由 Person1 扮演。保存更改时,EF 将从 Character1 开始,并看到数据库中不存在 Person1 并将其插入Person
到dbo.Person
. 然后它将转到 Character2 但看到 Person1 已经存在并且将引发主键冲突。
在我的MovieRepository
我有一个Add(Movie entity)
方法。我遍历每Character
一个Movie
并检查Person
数据库中是否存在相关的。如果他们这样做,那么我将Person
属性设置为现有的Person
. 这在正常情况下有效,但如果Person
根本不存在,那么我不确定如何避免 PK 违规,这是我的问题:)
public class MovieRepository : Repository<Movie> {
public MovieRepository(MovieContext context) : base(context) {}
public override void Add(Movie entity) {
foreach (var character in entity.Characters) {
var person = Context.People.FirstOrDefault(p => p.Id == character.Person.Id);
if (person != null)
character.Person = person;
}
Context.Movies.Add(entity);
}
}
只是为了添加更多信息。我使用存储库模式和工作单元模式来保存我的存储库和上下文。所以UnitOfWork
类负责SaveChanges()
。
尝试这样做MovieRepository.Add()
可能不是完成此任务的最佳/适当方式。我期待着任何和所有的建议。
只是为了进一步澄清,我从 Rotten Tomatoes API 获取数据,json 看起来像这样......
{data : [{
Id: 12345,
Title: 'Movie1',
Year: 2010,
Character: [{
Name: 'Character1',
Person: { Id: 1, Name: 'Person1' }
},{
Name: 'Character2',
Person: { Id: 2, Name: 'Person2' }
}]
}]}