[英]Why does Entity Framework add a related record even if it already exists in the database?
为什么 Entity Framework 会添加相关记录,即使它已经存在于数据库中? 在这种情况下,它应该只更新联结表)?
我正在使用 Entity Framework 6,我在Directors
和Movies
之间建立了多对多的关系。 我想使用名为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
是否为默认值( 0
或Guid.Empty
),如果是不 - 使用Attach
:
foreach (var director in movieToInsert.Directors)
{
if (director.Id > 0)
{
_unitOfWork.Directors.Attach(director);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.