【发布时间】:2021-11-29 16:13:08
【问题描述】:
我有以下课程(为简单起见减少了)。
public class User : Entity
{
public List<Skill> Skills { get; set; }
}
public class Skill : ValueObject
{
public string Name { get; private set; }
}
我的UserConfiguration 类如下:
public class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder
.OwnsMany(user => user.Skills);
}
}
这里我说 EF 我的 User 类拥有一些 Skills 并生成下表:
我使用工作单元模式,因此在我的存储库中,我对 Update 方法执行以下操作:
public virtual void Update(T entityToUpdate)
{
_context.Entry(entityToUpdate).State = EntityState.Modified;
}
更新后我调用我的Commit 方法,它会保存更改:
public void Commit()
{
_dbContext.SaveChanges();
}
据我所知,在获取User 实体时,我正确接收了所有属性(包括Skills),但在更新时更新的是除Skills 之外的每个属性。
我尝试手动设置Skill's表的主键和外键以这种方式更改UserConfiguration类(结果相同,技能未更新):
public class UserConfiguration : IEntityTypeConfiguration<User>
{
public void Configure(EntityTypeBuilder<User> builder)
{
builder
.OwnsMany(user => user.Skills, skill =>
{
skill.WithOwner().HasForeignKey("UserId");
skill.Property<int>("Id");
skill.HasKey("id");
});
}
}
我还尝试将我的Update 方法更改为:
public virtual void Update(T entityToUpdate)
{
_dbSet.Update(entityToUpdate);
}
但我收到以下异常:Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException : Database operation expected to affect 1 row(s) but actually affected 0 row(s).
注意 Skill 是一个 ValueObject(它有一个影子 ID)。我实际上认为应该有问题。
非常感谢您的帮助。
编辑:由于@pejman 的回答对我不起作用,我将把我的 UnitOfWork、Repository 和 Context 放在这里(为简单起见减少了),因为这是我唯一没有做过的事情,例如 @ pejman,也许问题就在那里,但我看不到。
Repository:
class BaseRepository<T> : IRepository<T> where T : Entity
{
private readonly Context _context;
private readonly DbSet<T> _dbSet;
public BaseRepository(Context context)
{
_context = context;
_dbSet = context.Set<T>();
}
public virtual T GetById(Guid id) => _dbSet.AsNoTracking().FirstOrDefault(x => x.Id == id);
public virtual void Update(T entityToUpdate)
{
_context.Entry(entityToUpdate).State = EntityState.Modified;
}
}
Unit of work:
public class UnitOfWork : IUnitOfWork
{
private const int SqlObjectAlreadyExistsErrorNumber = 2627;
private readonly Context _dbContext;
private BaseRepository<User> _users;
public UnitOfWork(Context dbContext)
{
_dbContext = dbContext;
}
public IRepository<User> Users
{
get
{
return _users ??= new BaseRepository<User>(_dbContext);
}
}
public void Commit()
{
_dbContext.SaveChanges();
}
}
Context:
public class Context : DbContext
{
public Context(DbContextOptions<DeribeContext> options)
: base(options)
{
}
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(typeof(DeribeContext).Assembly);
base.OnModelCreating(modelBuilder);
}
}
【问题讨论】:
-
您是否尝试过在不附加实体的情况下进行更新?
-
@SvyatoslavDanyliv 是的,我试过了,我得到了这个例外:
Microsoft.EntityFrameworkCore.DbUpdateConcurrencyException : Database operation expected to affect 1 row(s) but actually affected 0 row(s).我将用它更新问题。 -
您还应该提供您在代码中提到的其他类。我们无法根据假设回答。
-
@GertArnold 你到底是指哪些类?感谢您的帮助。
-
你的类是从其他类派生的。
标签: c# .net-core entity-framework-core