通过id-array以通用方式将子实体附加到父实体



在使用通用存储库模式时,我使用以下函数来添加实体:

public class BaseRepository<TEntity> : IBaseRepository<TEntity>
where TEntity : class, IEntity
{
public async Task<TEntity> AddEntity(TEntity entity)
{
this.databaseContext.Set<TEntity>().Add(entity);
await this.databaseContext.SaveChangesAsync();
return entity;
}
}

我有两个实体,公司和用户之间有一对多关系:

public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Company
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
}

我收到一个用户模型从我的控制器与以下属性:

{
string Name = "Example User",
int[] Companies = [1, 3, 7] <--- representing existing company-id's
}

我现在可以以某种方式从int[] Companies到填充List<Company> Companies以通用的方式(因为我有这样的多个实体)?

可能是这样的:

  • 从'TEntity'中获取所有'Navigation Property Names',这将导致'Companies'。
  • 然后在控制器模型中找到匹配的属性,得到int[] Companies
  • 然后,根据匹配的int[] Companies中的id填充List<Company> Companies
  • 最后保存TEntity.

这样的事情可以实现吗?

在从BaseRepository调用泛型方法之前,你需要在服务/工作单元/任何你使用的第二层中完成它。

如果用户是新用户,

YourService.cs或YourUnitOfWork.cs

public void Save(User user, int[] companiesID)
{
var companies = YourBaseRepositoryCompany.GetEntities(x => companiesID.contains(x.Id));
user.Companies = companies;
YourBaseRepositoryUser.SaveEntities(user);
}

如果你的用户已经存在,你可以在控制器中调用BaseRepositoryUser的save。所有实体将被更新。

最新更新