C# 在多对多关系上保存更改失败

C# 在多对多关系上保存更改失败,c#,entity-framework,C#,Entity Framework,这里是我的基地: 并且它包含一部电影(ID来自外部REST API): 现在,当我尝试插入一部新电影时,我经常会遇到一个异常,即我正在插入一个已经存在于基础中的实体 假设我有另一部“冒险”电影: 如何避免此异常?检索电影类型,而不是每次都创建它。或者这是显而易见的吗?我想你会检查数据库中是否已经存在类型的。如果是,请将movie.Kinds集合中的种类替换为从数据库加载的种类。如果否,则保留反序列化的种类并创建一个新的kind实体,例如: using(Stream stream = myExte

这里是我的基地:

并且它包含一部电影(ID来自外部REST API):

现在,当我尝试插入一部新电影时,我经常会遇到一个异常,即我正在插入一个已经存在于基础中的实体

假设我有另一部“冒险”电影:


如何避免此异常?

检索电影类型,而不是每次都创建它。或者这是显而易见的吗?

我想你会检查数据库中是否已经存在
类型的
。如果是,请将
movie.Kinds
集合中的种类替换为从数据库加载的种类。如果否,则保留反序列化的种类并创建一个新的
kind
实体,例如:

using(Stream stream = myExternalStream)
{
    Movie movie = Unserialize(stream);
    var newKindList = new List<Kind>();
    foreach(var kind in movie.Kinds)
    {
        var kindInDB = _context.Kinds
            .SingleOrDefault(k => k.KindId == kind.KindId);
        if (kindInDB != null)
            newKindList.Add(kindInDB);
        else
            newKindList.Add(kind);
    }
    movie.Kinds = newKindList;
    _context.AddToMovies(movie);
}
_context.SaveChanges();
使用(Stream=myExternalStream)
{
电影=未序列化(流);
var newKindList=新列表();
foreach(电影中的种类变量。种类)
{
var kindInDB=\u context.Kinds
.SingleOrDefault(k=>k.KindId==kind.KindId);
if(kindInDB!=null)
newKindList.Add(kindInDB);
其他的
newKindList.Add(种类);
}
movie.Kinds=newKindList;
_上下文。AddToMovies(电影);
}
_SaveChanges();

是,因为反序列化时自动完成,有些可以存在,有些不存在,所以答案实际上是尝试检索,只有在不存在时才创建。这就是我评论的意思。是不是因为你试图输入同一个KindID而出错?名称似乎不需要是唯一的。
// Here all data comes from an external source and have no control over it.
using(Stream stream = myExternalStream)
{
   Movie movie = Unserialize(stream);
   _context.AddToMovies(movie);
}
// throws the exception because the kind "Adventure" already exists
_context.SaveChanges();
using(Stream stream = myExternalStream)
{
    Movie movie = Unserialize(stream);
    var newKindList = new List<Kind>();
    foreach(var kind in movie.Kinds)
    {
        var kindInDB = _context.Kinds
            .SingleOrDefault(k => k.KindId == kind.KindId);
        if (kindInDB != null)
            newKindList.Add(kindInDB);
        else
            newKindList.Add(kind);
    }
    movie.Kinds = newKindList;
    _context.AddToMovies(movie);
}
_context.SaveChanges();