1

我有一个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。

AMovie与 具有多对多关系PersonCharacter是两者之间的桥梁。

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并在它已经存在的情况下忽略它吗?如果不是,此类问题的最佳实践是什么?

4

2 回答 2

0

如果 Person 对象已经存在,我认为没有必要附加它们。

我要做的是遍历 API Person 对象并与 EF DbContext 进行比较。

var dbPerson = MyMovieContext.Persons.Where(x => x.ID == myPersonID).SingleOrDefault();

如果找不到匹配项,请添加。如果确实找到匹配项,则将 Character 上的引用替换为 DbContext 中的实体。

于 2012-12-13T15:26:31.347 回答
0

如果您使用 DbContext API,则可以使用AddOrUpdate扩展方法。假设您有一个列表或人员,那么您可以执行以下操作:

context.Persons.AddOrUpdate(persons.ToArray());

您可能会为每个模型项目(persons是项目的人)执行此操作,然后创建Character带有PersonMovie附加对象的对象。

请注意,AddOrUpdate仅在上下文中添加或更新。只SaveChanges提交到数据库。

于 2012-12-13T16:39:29.520 回答