C# EF6添加上的多对多关系重复条目

C# EF6添加上的多对多关系重复条目,c#,.net,entity-framework,repository-pattern,C#,.net,Entity Framework,Repository Pattern,我的数据在展览和市场之间存在多对多关系。 创建新展览时,应为其分配一些现有市场。 我创建了一个通用存储库,如下所示: public virtual TDto Create(TDto data) { TEntity entity = ToEntity(data); DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity); dbEntity.State =

我的数据在
展览
市场
之间存在多对多关系。 创建新展览时,应为其分配一些现有市场。 我创建了一个通用存储库,如下所示:

public virtual TDto Create(TDto data)
{
        TEntity entity = ToEntity(data);
        DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity);
        dbEntity.State = EntityState.Added;
        UpdateReferences(data, dbEntity);
        Context.SaveChanges();
        data = ToModel(dbEntity.Entity);
        return data;
}
因此,我的问题是如何说服英孚将现有市场关联起来,而不是创建重复的市场


我读过很多关于使用ID属性和导航属性来避免此类问题的文章,但对于多对多关系,这似乎不是一个选项。

当您将
条目的
状态更改为
添加的
时,条目的状态及其所有关系的状态将更改为添加的
。因此,没有必要单独添加这些关系


因此,注释行
UpdateReferences(data,dbEntity)Create
方法中使用code>,一切正常。

当您将
条目的
状态更改为
Added
时,条目的状态及其所有关系的状态将更改为
Added
。因此,没有必要单独添加这些关系


因此,注释行
UpdateReferences(data,dbEntity)创建
方法中,一切都应该正常。

我感觉这行有问题

entity.Entity.Markets = new List<Model.EventManagement.Market>();
您能否在实体的构造函数中尝试以下操作:

public Exhibition() {
    Markets = new List<Model.EventManagement.Market>();
}

如果它不能正常工作,可能是启用代理是关键。

我感觉线路有问题

entity.Entity.Markets = new List<Model.EventManagement.Market>();
您能否在实体的构造函数中尝试以下操作:

public Exhibition() {
    Markets = new List<Model.EventManagement.Market>();
}

如果它不能正常工作,可能是启用代理是关键。

感谢您为我指明了正确的方向。 这一切都是关于
状态
设置为
已添加
的时间。我只需要交换
UpdateReferences
State=Added

public virtual TDto Create(TDto data)
{
    TEntity entity = ToEntity(data);
    DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity);
    // call UpdateReferences first...
    UpdateReferences(data, dbEntity);
    // ...then set the State to Added
    dbEntity.State = EntityState.Added;
    Context.SaveChanges();
    data = ToModel(dbEntity.Entity);
    return data;
}
要创建的公共虚拟TDto(TDto数据)
{
TEntity实体=实体(数据);
DbEntityEntry dbEntity=Context.Entry(实体);
//首先调用UpdateReferences。。。
更新引用(数据、数据库实体);
//…然后将状态设置为“已添加”
dbEntity.State=EntityState.Added;
SaveChanges();
数据=ToModel(dbEntity.Entity);
返回数据;
}

虽然它现在可以像预期的那样工作,但它非常混乱,因为我认为在之后设置状态也会将子状态设置为Added,但显然不是。。。¯\_(ツ)_/“

谢谢你为我指明了正确的方向。 这都是关于
状态
被设置为
Added
时的问题。我只需要交换
更新引用
状态=Added

public virtual TDto Create(TDto data)
{
    TEntity entity = ToEntity(data);
    DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity);
    // call UpdateReferences first...
    UpdateReferences(data, dbEntity);
    // ...then set the State to Added
    dbEntity.State = EntityState.Added;
    Context.SaveChanges();
    data = ToModel(dbEntity.Entity);
    return data;
}
要创建的公共虚拟TDto(TDto数据)
{
TEntity实体=实体(数据);
DbEntityEntry dbEntity=Context.Entry(实体);
//首先调用UpdateReferences。。。
更新引用(数据、数据库实体);
//…然后将状态设置为“已添加”
dbEntity.State=EntityState.Added;
SaveChanges();
数据=ToModel(dbEntity.Entity);
返回数据;
}

虽然它现在可以像预期的那样工作,但它非常混乱,因为我认为在之后设置状态也会将子状态设置为Added,但显然不是…“\_(ツ)_/“

我的问题是,现有市场与创建的展览没有关联,而是作为副本创建的市场。我的问题是,现有市场与创建的展览没有关联,而是作为副本创建的市场。
public virtual TDto Create(TDto data)
{
    TEntity entity = ToEntity(data);
    DbEntityEntry<TEntity> dbEntity = Context.Entry<TEntity>(entity);
    // call UpdateReferences first...
    UpdateReferences(data, dbEntity);
    // ...then set the State to Added
    dbEntity.State = EntityState.Added;
    Context.SaveChanges();
    data = ToModel(dbEntity.Entity);
    return data;
}