【问题标题】:Entities are not updated实体未更新
【发布时间】:2021-01-14 20:38:39
【问题描述】:

当我想更新实体时,EntityFraemwork 出现了一个奇怪的问题。 我有 User 实体和 Searchfilter 实体,它们有一对多的关系

public class User : IdentityUser
{
   public virtual List<SearchFilter> SearchFilters { get; set; }
}

public class SearchFilter : BaseEntity, IAggregateRoot
{
   public virtual User User { get; set; }
}

1 - 我创建用户 2 - 我运行创建用户并将其添加到 searchfilter 的方法

SearchFilter searchFilter = SearchFilterRepository.AddAsync(new SearchFilter
{
     SearchInDescription = false,
     SearchInTitle = false
 }).Result;
  

我使用了没有异步的 Result 进行了测试。我认为问题出在 EF 中的异步操作中。 那么:

 searchFilter.User = user;
 SearchFilterRepository.Update(searchFilter);

更新:

public void Update(T entity)
{
    _dbMainContext.Entry(entity).State = EntityState.Modified;
    _dbMainContext.SaveChanges();
}
 

我有一个错误:违反了“PK_AspNetUsers”PRIMARY KEY 约束。无法将重复键插入 dbo.AspNetUsers 对象。重复键值:(0e535b73-7cff-4152-9157-214b9821d264)。 该指令的执行已被中断。

我认为 EF,更新 SearchFilter 并添加新用户,已经存在,我该如何避免这种情况?

【问题讨论】:

    标签: c# .net entity-framework .net-5


    【解决方案1】:

    添加 UserId 属性并使用它而不是引用用户属性

    public class SearchFilter : BaseEntity, IAggregateRoot
    {
      public Guid UserId { get; set; }
      public virtual User User { get; set; }
    }
    

    然后使用插入或更新

    searchFilter.UserId = /* Add User Guid */;
    SearchFilterRepository.Update(searchFilter);
    

    【讨论】:

    • 是的,我知道,userid 是模型中的隐藏属性,但我不想在模型中看到它,我认为还有另一种解决方案
    • 隐藏属性是什么意思?
    • 如果我只创建公共虚拟用户 User { get;放;代码首先实现在 DB 表 SearchFilter 中创建 UserId,我认为有另一个解决方案排除在模型中创建 UserId 属性。我有另一个模型,我在其中做同样的事情,出现错误,但输入了数据
    • 也许您可以通过某种方式禁用从一个实体添加第三方实体
    • 我认为要更新用户,您应该选择完整的用户对象,否则 ef 会将此视为新用户,因此您可以在更新时使用 userId 或选择要编辑的用户的完整对象
    猜你喜欢
    • 2014-02-10
    • 1970-01-01
    • 2017-10-06
    • 2023-01-24
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多