Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 附加具有导航属性的实体时出现异常_C#_Asp.net Mvc_Entity Framework_Many To Many - Fatal编程技术网

C# 附加具有导航属性的实体时出现异常

C# 附加具有导航属性的实体时出现异常,c#,asp.net-mvc,entity-framework,many-to-many,C#,Asp.net Mvc,Entity Framework,Many To Many,我有实体展览和展览,它们是多对多关系展品也可以有许多类别 public class ExhibitionModel { public ExhibitionModel() { this.Exhibits = new List<ExhibitModel>(); } [Key] public int ExhibitionId { get; set; } //some props public virtual IL

我有实体
展览
展览
,它们是多对多关系<代码>展品也可以有许多类别

public class ExhibitionModel
{
    public ExhibitionModel()
    {
        this.Exhibits = new List<ExhibitModel>();
    }

    [Key]
    public int ExhibitionId { get; set; }

    //some props

    public virtual IList<ExhibitModel> Exhibits { get; set; }
}

public class ExhibitModel
{
    [Key]
    public int ExhibitId { get; set; }

    //some props

    public virtual IList<CategoryModel> Categories { get; set; }
    public virtual IList<ExhibitionModel> Exhibitions { get; set; }
}

public class CategoryModel
{
    [Key]
    public int CategoryId { get; set; }

    public virtual IList<ExhibitModel> Exhibits { get; set; }
}
展示库创建
方法

    public ExhibitionModel Create(ExhibitionModel exhibition)
    {
        try
        {
            using (var dbContext = new MuseumContext())
            {
                foreach (var exhibit in exhibition.Exhibits)
                {
                    if (exhibit.ExhibitId != 0 && dbContext.Entry(exhibit).State == EntityState.Detached)
                    {
                        dbContext.Exhibits.Attach(exhibit);
                    }
                }

                var result = dbContext.Exhibitions.Add(exhibition);
                dbContext.SaveChanges();
                return result;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }
如你所见,我附上了每一个展览实体,以避免创造新的记录。当两件展品的类别相同时,附加第二件展品会引发异常

附加“Project.Models.CategoryModel”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,尚未收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体状态跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”

我应该如何解决此问题

问候,,
Konrad

当实体已被EF跟踪时,通常会发生此错误。我想可能在这里:

exhibit = exhibitsRepo.Read(id);
你有两个选择

  • 您可以使用设置读取方法。 可能
    db.examples.AsNoTracking(),其中(x=>x.Id==Id)

    这样,您可以明确地告诉EF不要跟踪实体

  • 如果展品已经在数据库中,只需将其添加到展览收藏并保存更改,EF应为您制作并保存参考(在展品记录中)。 无需重新附着实体

  • exhibit = exhibitsRepo.Read(id);