c# - 如何在更新操作期间将记录与 Entity Framework Core 同步为一对多关系?不添加新实体,只是同步
问题描述
我有以下实体:PushTemplate
和PushTemplateMessage
。一个PushTemplate
可以有很多PushTemplateMessage
s。我有这个的存储库。所有的作品都适用于创建操作。但是当我尝试更新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 以设置新列表。但它继续将旧数据与新数据合并!错误在哪里?
解决方案
好的,我已经解决了。这篇文章很有帮助。这是来自答案。
所以,如果你想同步(而不是添加),即使你想设置新值,因为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
使用新的值列表设置或同步它。
推荐阅读
- node.js - 请运行`npm cache clean`
- amazon-web-services - CodePipeline 中的 CodeBuild 如何解析上一个 CloudFormation 步骤创建的资源?
- javascript - 在 NodeList 的元素之前和之后插入标记
- javascript - 设置 ESLINT 以忽略“额外分号”等警告
- c# - mvc中linq的存储过程
- php - php数组唯一值使用array_unique
- assembly - 在预测现代超标量处理器上的操作延迟时需要考虑哪些因素,以及如何手动计算它们?
- python - 使用 self 中定义的函数更新类变量
- unity3d - FBX 模型的 Unity3D 问题
- python-3.x - 如何从熊猫中的字符串中提取前8个字符