c# - 在 LINQ 中使用通用列
问题描述
我有一个基Entity
类型,我将其用作多个实体类型的基类:Customer : Entity
、Product : Entity
等。其中每个都有一个以实体类型命名的现有 id 列:CustomerId
、ProductId
等。因为它们都有不同的名称但功能相同,我决定使用一个未映射的通用 Id 列,这些列中的每一个都可以定义来引用该类型的“真实”Id 列:
public abstract class Entity<T> where T: Entity<T>
{
[NotMapped]
public abstract int Id { get; set; }
}
public class Customer : Entity<Customer>
{
[JsonIgnore]
public override int Id { get => CustomerId; set => CustomerId = value; }
public int CustomerId { get; set; }
}
问题是,当我尝试使用它时:
[HttpPut("put")]
public async Task<ActionResult<bool>>> PutEntity(List<T> entities)
{
foreach (T entity in entities)
if (!MyEntities.Any(e => e.Id == entity.Id))
return NotFound(false);
}
我得到一个例外The LINQ expression 'DbSet<Customer>.Any(d => d.Id == ___Id_0' could not be translated.
有什么办法可以解决这个问题,以允许 LINQ 使用对具有未知名称的列的通用引用来运行查询?
解决方案
尝试指定用于覆盖Id
属性的列名:
public class Customer : Entity<Customer>
{
[Column("CustomerId")]
public override int Id { get; set; }
另一种解决方案是使用配置类。您还可以创建这些配置类的继承层次结构,以便在单个位置配置基本实体属性,同时您可以选择覆盖您认为合适的配置值。快速示例:
public abstract class BaseEntity
{
public int Id { get; set; }
}
public class Customer : BaseEntity
{
// Id not needed
}
public abstract class BaseEntityConfiguration<TEntity>
: IEntityTypeConfiguration<TEntity>
where TEntity is BaseEntity
{
public void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.HasKey(c => c.Id); // defined in single location
}
}
public class CustomerConfiguration : BaseEntityConfiguration<Customer>
{
public void Configure(EntityTypeBuilder<Customer> builder)
{
base.Configure(builder); // configure base class' properties
builder
.Property(c => c.Id)
.HasColumnName("CustomerId"); // override column name
}
}
推荐阅读
- vue.js - 在生成中设置变量:使用 Nuxt 挂钩之前
- angular - @ngrx/data 中未更新的实体
- python - 使用 django-filter,是否有一种快速的方法来支持所有可能的字段查找?
- python - 当字典具有不同的键时,将 Python 字典组合到 Spark 数据帧中
- griddb - GridDB 没有 sql 客户端不会构建 rpm
- python - 有没有办法在 Visual Studio Code 的集成 jupyter notebook 功能中获得降价代码交互?
- google-cloud-platform - GCP DLP 无法运行 dlp.deidentify_content 方法获取异常请求涉及位置“us-east1”,但已发送到位置“全球”
- ios - 通过 AKMixer 连接时,AKMetronome 在节拍 1 上隐藏 AKMIDISampler
- php - 将jquery ajax数组传递给php不起作用
- three.js - 使用 tweenmax 为threeJS 浅色设置动画