首页 > 解决方案 > 如何在更新操作期间将记录与 Entity Framework Core 同步为一对多关系?不添加新实体,只是同步

问题描述

我有以下实体:PushTemplatePushTemplateMessage。一个PushTemplate可以有很多PushTemplateMessages。我有这个的存储库。所有的作品都适用于创建操作。但是当我尝试更新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. 但我只需要一个新的!如您所见,在存储库中,我尝试“清理”旧PushTemplateMessages 以设置新列表。但它继续将旧数据与新数据合并!错误在哪里?

标签: c#asp.net-coreentity-framework-core

解决方案


好的,我已经解决了。这篇文章很有帮助。这是来自答案。

所以,如果你想同步(而不是添加),即使你想设置新值,因为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使用新的值列表设置或同步它。


推荐阅读