Как синхронизировать записи с Entity Framework Core для отношения один ко многим во время операции обновления?Не добавлять новую сущность, просто синхронизировать - PullRequest
0 голосов
/ 22 сентября 2019

У меня есть следующие объекты: PushTemplate и PushTemplateMessage.Один PushTemplate может иметь много PushTemplateMessage с.У меня есть репозитории для этого.Все работает для операции создания.Но проблема начинается, когда я пытаюсь обновить PushTemplate и установить новый текст для сообщений.Insetad обновления я вижу новый PushTemplateMessage.Я покажу свой код.

Сущность PushTemplate:

public class PushTemplate
{
    public int PushTemplateId { get; set; }

    [Required]
    public List<PushTemplateMessage> Messages { get; set; }

    public DateTime CreatedAt { get; set; }

    public PushTemplate()
    {
        CreatedAt = DateTime.UtcNow;
    }
}  

Сущность PushTemplateMessage:

public class PushTemplateMessage
{
    public int PushTemplateMessageId { get; set; }

    public string PushTitle { get; set; }
    public string PushMessage { get; set; }
    public PushTemplate PushTemplate { get; set; }
}

Репозиторий PushTemplateRepository:

public class PushTemplateRepository : IPushTemplateRepository
{
    private readonly ApplicationDbContext _applicationContext;

    public PushTemplateRepository(ApplicationDbContext applicationContext)
    {
        _applicationContext = applicationContext;
    }

    public IQueryable<PushTemplate> PushTemplates => _applicationContext.PushTemplates;

    public void Save(PushTemplate pushTemplate)
    {
        if (pushTemplate.PushTemplateId == 0)
        {
            _applicationContext.PushTemplates.Add(pushTemplate);
        }
        else
        {
            PushTemplate dbEntity = _applicationContext.PushTemplates.Find(pushTemplate.PushTemplateId);

            dbEntity.Messages = new List<PushTemplateMessage>();

            _applicationContext.SaveChanges();

            dbEntity.Messages = pushTemplate.Messages;

        }

        _applicationContext.SaveChanges();
    }
}

Контекст базы данных:

public class ApplicationDbContext : IdentityDbContext
{
    private readonly string _connectionString;

    public DbSet<PushTemplate> PushTemplates { get; set; }
    public DbSet<PushTemplateMessage> TemplateMessages { get; set; }
    public ApplicationDbContext(IConfiguration configuration)
    {
        _connectionString = configuration.GetConnectionString("MakeAppDb");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("MakeAppPushesNet_2"));
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<PushTemplate>()
            .HasMany(x => x.Messages)
            .WithOne(y => y.PushTemplate)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

И, наконец, вызовите операцию обновления с моего контроллера:

PushTemplate pushTemplate = new PushTemplate
{
        Messages = pushTemplateMessages // new list of messages
}; 

_pushTemplateRepository.Save(pushTemplate);

После этой операции у меня есть старая PushTemplateMessage и новая версия PushTemplateMessage.Но мне нужен только новый!Как вы можете видеть, в репозитории я пытался «очистить» старые PushTemplateMessage s, чтобы установить новый список.Но он продолжает сливать старые данные с новыми!Где ошибка?

1 Ответ

0 голосов
/ 22 сентября 2019

Хорошо, я решил это.Это сообщение было полезно.Это из ответа.

Итак, если вы хотите синхронизировать (не добавлять), даже если вы хотите установить новые значения как NULL, вы должны использовать include("EntityName") в своем контексте БД.Теперь мой код репозитория сохранения / обновления:

    public void Save(PushTemplate pushTemplate)
    {
        if (pushTemplate.PushTemplateId == 0)
        {
            _applicationContext.PushTemplates.Add(pushTemplate);
        }
        else
        {
            PushTemplate dbEntity = _applicationContext.PushTemplates
                .Include(x => x.Messages)
                .FirstOrDefault(x => x.PushTemplateId == pushTemplate.PushTemplateId);

            dbEntity.Messages = pushTemplate.Messages;

        }

        _applicationContext.SaveChanges();
        }

Как видите, я просто использую Include().И теперь я могу установить null или синхронизировать его с новым списком значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...