问题描述
我的基本存储库类
public class Repository<TEntity,TId> : IRepository<TEntity,TId> where TEntity : class,IEntity<TId>
{
protected readonly CBSContext _context;
private DbSet<TEntity> _entities;
public Repository(CBSContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
_entities = _context.Set<TEntity>();
}
public async Task UpdateAsync(TEntity entity)
{
await Task.Run(() => _context.Entry(entity).State = EntityState.Modified);
}
//Update child enitity code added below
}
和我的实体接口
public interface IEntity<TId>
{
TId Id { get; set; }
}
public class Customer : IEntity<int>
{
public int Id { get; set; }
public string CustomerNo { get; set; }
public ICollection<Address> Addresses { get; set; } = new List<Address>();
}
我需要在断开连接的方案中添加/更新/删除子实体。
AM引用此答案Add/update/delete child entities
那个分析器基于自定义BaseEnity,但是我使用的是IEnity。
已完成的工作:
我用Tentity代替了baseentity。但显示错误
下面是保存子元素的新代码
public async Task UpdateAsync(TEntity entity,params Expression<Func<TEntity,object>>[] navigations)
{
var dbEntity = await _context.FindAsync<TEntity>(entity.Id);
var dbEntry = _context.Entry(dbEntity);
dbEntry.CurrentValues.SetValues(entity);
foreach (Expression<Func<TEntity,object>> property in navigations)
{
var propertyName = property.GetPropertyAccess().Name;
var dbItemsEntry = dbEntry.Collection(propertyName);
var accessor = dbItemsEntry.Metadata.GetCollectionAccessor();
await dbItemsEntry.LoadAsync();
var dbItemsMap = ((IEnumerable<TEntity>)dbItemsEntry.CurrentValue)
.ToDictionary(e => e.Id);
var items = (IEnumerable<object>) accessor.GetOrCreate(entity);
foreach (var item in items)
{
if (!dbItemsMap.TryGetValue(item.Id,out var oldItem))
accessor.Add(dbEntity,item);
else
{
_context.Entry(oldItem).CurrentValues.SetValues(item);
dbItemsMap.Remove(item.Id);
}
}
foreach (var oldItem in dbItemsMap.Values)
accessor.Remove(dbEntity,oldItem);
}
await Task.Run(() => _context.SaveChangesAsync());
}
以下显示错误:
.net核心是否有其他替代方法。.am请提出任何替代方法。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)