在Entity Framework中插入具有多对多关系的新对象

时间:2012-12-13 15:03:34

标签: entity-framework

我有一个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我从中获取信息。

MoviePerson有多对多关系,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并忽略它(如果它已经存在)?如果没有,这类问题的最佳做法是什么?

2 个答案:

答案 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是项目的人员),然后创建附加了CharacterPerson个对象的Movie个对象。< / p>

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