在使用通用存储库模式时,我使用以下函数来添加实体:
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。所有实体将被更新。