【问题标题】:Attach child entities via id-array to parent entity in a generic way通过 id-array 以通用方式将子实体附加到父实体
【发布时间】:2021-02-13 10:30:23
【问题描述】:

在使用通用存储库模式时,我有以下用于添加实体的功能:

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&lt;Company&gt; Companies (因为我有多个这样的实体)?

可能是这样的:

  • 从“TEntity”中获取所有“导航属性名称”,这将导致“公司”。
  • 然后,在控制器模型中找到匹配的属性,这将导致int[] Companies
  • 然后,根据匹配的int[] Companies 中的ID 填充List&lt;Company&gt; Companies
  • 最后,保存 TEntity。

这样的事情能实现吗?

【问题讨论】:

    标签: c# generics entity-framework-core


    【解决方案1】:

    在从 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 的保存即可。所有实体都将更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2021-04-19
      • 2020-05-31
      • 2020-11-04
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多