Как я могу реализовывать update в связи многие во многие EntityFramework 6 с Хранилищем и UnityOfWork?

introducir la descripción de la imagen aquí

У промежуточной Таблицы нет "PrimaryKey" (первичный ключ). Говорится о таблице с составными идентификаторами, так что он поэтому не появляется.

мой вопрос: Как реализовывать update в связи многие во многие EntityFramework 6 с Хранилищем и UnityOfWork?

7
задан 16.03.2016, 17:29
1 ответ

Установив связь многих во многие с Энтити Фрамеворк имеются два свойства навигации типа коллекции (одна в каждой организации), которые позволяют обновлять стоимость вышеупомянутой связи.

В этом случае код организаций, которые произвелись бы для этой модели, они были бы нечто похожим:

public class Usuario
{
    /// <summary>
    /// Identificador del usuario
    /// </summary>
    public int IdUsuario { get; set; }

    /// <summary>
    /// Propiedad de navegación relación muchos a muchos Usuarios-Compromisos
    /// </summary>
    public virtual Collection<Compromiso> Compromisoes { get; set; }
}

public class Compromiso
{
    /// <summary>
    /// Identificador del compromiso
    /// </summary>
    public int IdCompromido { get; set; }

    /// <summary>
    /// Propiedad de navegación relación muchos a muchos Usuarios-Compromisos
    /// </summary>
    public virtual Collection<Usuario> Usuarioes { get; set; }
}

и DbContext, который имелся бы, был бы похожим на этот:

public class MyDbContext: DbContext
{
    public DbSet<Usuario> Usuarioes { get; set; }

    public DbSet<Compromiso> Compromisoes { get; set; }
}

Сейчас давайте представлять, что существует Договоренность с Id = 3 и Пользователь с Id = 1, связь между ними установилась бы, таким образом:

int idUsuario = 1;
int idCompromiso = 3;

using (var context = new MyDbContext())
{
    var usuario = context.Usuarioes.Find(idUsuario);
    var compromiso = context.Compromisoes.Find(idCompromiso);

    // Establecer la relación entre el usuario y el compromiso
    compromiso.Usuarioes.Add(usuario);

    context.SaveChanges();
}

Проблема работы так, чем в свойстве Usuarioesони идут загружать данные всех пользователей, ассоциируемых с договоренностью, хотя этот груз может быть предотвращенным соглашаясь на ObjectStateManager и устанавливая связь на низком уровне:

int idUsuario = 1;
int idCompromiso = 3;

using (var context = new MyDbContext())
{
    var usuario = context.Usuarioes.Find(idUsuario);
    var compromiso = context.Compromisoes.Find(idCompromiso);

    // Establecer la relación entre el usuario y el compromiso
    var stateManager = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager;
    stateManager.ChangeRelationshipState<Compromiso>(
       compromiso, 
       usuario, 
       c => c.Usuarioes, 
       EntityState.Added);

    context.SaveChanges();
}

Относительно как делать это используя главные файлы Репоситорио и UnitOfWork, как обозначался Леандро Туттини в комментариях, завись от много от, как были осуществлены эти главные файлы, потому что есть несколько способов это делать.

Выбор был бы продолжая осуществление характерного хранилища этой статьи о документации ASP.NET и он состоял в добавлении двух методов, одного, чтобы добавлять элементы к связи и другому, чтобы удалять их.

Осуществление этих методов было бы таким:

public class GenericRepository<TEntity> where TEntity : class
{

    ...

    public virtual void AddRelatedEntity(
        TEntity sourceEntity,
        object targetEntity,
        Expression<Func<TEntity, object>> navigationPropertySelector)
    {
        var stateManager = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager;
        stateManager.ChangeRelationshipState<TEntity>(
            sourceEntity, targetEntity, navigationPropertySelector, EntityState.Added);
    }

    public virtual void RemoveRelatedEntity(
        TEntity sourceEntity,
        object targetEntity,
        Expression<Func<TEntity, object>> navigationPropertySelector)
    {
        var stateManager = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager;
        stateManager.ChangeRelationshipState<TEntity>(
            sourceEntity, targetEntity, navigationPropertySelector, EntityState.Deleted);
    }
}

И код, чтобы устанавливать связь между обеими организациями используя эти главные файлы, был бы следующим:

int idUsuario = 1;
int idCompromiso = 3;

using (var unitOfWork = new MyUnitOfWork())
{
    var usuario = unitOfWork.UsuarioRepository.GetByID(idUsuario);
    var compromiso = unitOfWork.CompromisoRepository.GetByID(idCompromiso);

    // Establecer la relación entre el usuario y el compromiso
    unitOfWork.UsuarioRepository.AddRelatedEntity(
        usuario, 
        compromiso, 
        u => u.Compromisoes);

    unitOfWork.Save();
}

Заметь: Код всех примеров упрощен максимально для того, чтобы поняли лучше, из-за того, что не является подходящим, чтобы это использовать в производстве

2
ответ дан 24.11.2019, 14:43

Теги

Похожие вопросы