我正在使用带有代码优先方法的 Entity Framework 5。
我有两个彼此具有多对多关系的类,Movie并且Person. A通过 aMovie与 a 相关。每个都可以有多个字符。PersonCharacterMovie
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' }
}]
}]}