Невозможно удалить и вставить M-M реляционные данные с помощью Entity Framework - PullRequest
0 голосов
/ 15 мая 2018

У меня есть реляционная структура данных M-M следующим образом. Но я не могу удалить и вставить запись. Я гуглил и использую образцы из Link1 и Link2

Компания:

[Serializable]
public class Company : Base.BaseEntity
{
    public long CompanyId { get; set; }
    public string CompanyName { get; set; }
    public string TimeZone { get; set; }
    public string Address { get; set; }
    public long? CityId { get; set; }
    public long? StateId { get; set; }
    public int Zip { get; set; }
    public string Telephone { get; set; }
    public string Fax { get; set; }
    public string EmailAddress { get; set; }
    public string FederalEin { get; set; }
    public string WebPage { get; set; }
    public string StateEmployerNumber { get; set; }
    public long? AdministratorId { get; set; }
    public string OfflineAdlLockoutTime { get; set; }
    public bool? IsAllowWindowsAuthentication { get; set; }
    public virtual ICollection<CommunityType> CommunityTypeList { get; set; }
}

Тип сообщества:

[Serializable]
public class CommunityType : Base.BaseEntity 
{
    public long CommunityTypeId { get; set; }
    public string CommunityTypeName { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Company> CompanyList { get; set; }
}

И у меня есть метод репо

CompanyRepository

public void Persist(Company entity)
{
    using (var dbContext = ServiceLocator.Current.GetInstance<IDbContext>())
    {
        // Here I am going to save the company information (may be edited some properties).
        dbContext.Persist(entity, entity.CompanyId);
        dbContext.SaveChanges(entity.CompanyId);

        // Here I am trying to delete the existing community types and insert a new community types.
        var existingCompany = dbContext.Table<Company>().Include(i => i.CommunityTypeList).AsNoTracking().Where(s => s.CompanyId == entity.CompanyId).FirstOrDefault();
        var deletedCommunityTypes = existingCompany.CommunityTypeList.Except(entity.CommunityTypeList, x => x.CommunityTypeId).ToList();
        var addedCommunityTypes = entity.CommunityTypeList.Except(existingCompany.CommunityTypeList, x => x.CommunityTypeId).ToList();
        deletedCommunityTypes.ForEach(c => existingCompany.CommunityTypeList.Remove(c));

        foreach (var c in addedCommunityTypes)
        {
            existingCompany.CommunityTypeList.Add(c);
        }

        dbContext.Persist(existingCompany, existingCompany.CompanyId);
        dbContext.SaveChanges(existingCompany.CompanyId);
    }
}

И мой метод контекста БД как

public void Persist<TEntity>(TEntity entity, long id, bool isHardDelete = false) where TEntity : BaseEntity
{
    try
    {
        if (!isHardDelete)
        {
            var item = entity as BaseEntity;
            if (id <= 0)
            {
                Entry(entity).State = EntityState.Added;
                Set<TEntity>().Add(entity);
            }
            else
            {
                Set<TEntity>().Attach(entity); // I have an error here
                Entry(entity).State = EntityState.Modified;
            }
        }
        else
        {
            Entry(entity).State = EntityState.Deleted;
            Set<TEntity>().Attach(entity);
        }
    }
    catch (DbEntityValidationException dbEx)
    {
        throw new Exception(GetFullErrorText(dbEx), dbEx);
    }
}

public int SaveChanges(long id = 0)
{
    try
    {
        ChangeTracker.Entries().ForEach(entity =>
        {
            var baseDto = entity.Entity as BaseEntity;
            if (baseDto == null) return;
            if (id <= 0)
            {
                baseDto.CreatedOn = baseDto.UpdatedOn = DateTime.Now;
                baseDto.CreatedBy = baseDto.UpdatedBy = 1;
            }
            else
            {
                baseDto.UpdatedBy = 1;
                baseDto.UpdatedOn = DateTime.Now;
            }
        });
        return base.SaveChanges();
    }
    catch (DbEntityValidationException dbEx)
    {
        throw new Exception(GetFullErrorText(dbEx), dbEx);
    }
}

У меня есть ошибка ниже, когда прикрепить объект.

Присоединение сущности типа 'RDS.Models.Entities.Masters.Company' не удалось, потому что другой объект того же типа уже имеет тот же значение первичного ключа. Это может произойти при использовании метода «Присоединить» или установка состояния объекта на «Неизменен» или «Изменен», если таковые имеются сущности в графе имеют конфликтующие ключевые значения. Это может быть потому, что некоторые объекты являются новыми и еще не получили ключ, сгенерированный базой данных ценности. В этом случае используйте метод «Добавить» или состояние «Добавлено». отслеживать график, а затем установить состояние не новых объектов в «Неизмененный» или «Измененный» в зависимости от ситуации.

...