繁体   English   中英

为什么 Entity Framework 会添加相关记录,即使它已经存在于数据库中?

[英]Why does Entity Framework add a related record even if it already exists in the database?

为什么 Entity Framework 会添加相关记录,即使它已经存在于数据库中? 在这种情况下,它应该只更新联结表)?

我正在使用 Entity Framework 6,我在DirectorsMovies之间建立了多对多的关系。 我想使用名为MovieUpdateDto的 Dto 发布一部新电影。 Movie class 具有ICollection<Directors> Directors类型的属性。

代表 Dto 的 json 如下所示:

{
    "Name": "new movie",
    "Description": "new movie Description",
    "Price": 1000.0,
    "Directors": [{"Id": 11, "Name": "Coco"}, {"Id": "12", "Name": "Jambo"}]
}

Post 的问题在于,当插入具有一个或多个现有导演(已添加到数据库中)的电影时,它无法按预期工作。 在这种情况下,这些导演被读入数据库。

附带说明一下,当我添加带有导演信息的电影 dto 时,EF 隐式地将导演添加为 Director 表中的新记录,并且还隐式处理了联结表MoviesDirectors

这是我的第一次尝试:

// POST: api/movies
public void Post([FromBody] MovieUpdateDto movie) 
{
    var bookToInsert = Mapper.Map<Movie>(movie);

    foreach (var director in movieToInsert.Directors)
    {
        var existingDirector = _unitOfWork.Directors.Find(d => d.Id == director.Id);
        if (existingDirector.Any())
        {
            // don't add director again to the database, but do add (directorId, bookId) in the MoviesDirectors junction table. 
            // How do I reference the junction table though? Should this work somehow without referencing the juntion table? 
        }
    }
    _unitOfWork.Movies.Add(movieToInsert);
    _unitOfWork.Complete();
}    

PS:

在设置正确的配置时,EF 会自动生成名为MoviesDirectors的联结表。 更准确地说,在MovieConfiguration class 中,我有:

HasMany(c => c.Directors)
    .WithMany(t => t.Movies)
    .Map(m =>
    {
        m.ToTable("MoviesDirectors"); // a way to overwrite the name that EF gives this table
        m.MapLeftKey("MovieId");
        m.MapRightKey("DirectorId");
    });
    

它会自动创建MoviesDirectors

对于您的第二次尝试,您可以只执行foreach (var director in movieToInsert.Directors.ToList()) ,但我建议仅检查director.Id是否为默认值( 0Guid.Empty ),如果是不 - 使用Attach

foreach (var director in movieToInsert.Directors)
{
    if (director.Id > 0)
    {
       _unitOfWork.Directors.Attach(director);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM