首页 > 解决方案 > 来自基类的索引数据注释的异常

问题描述

我开始了ASP.net Core,我正在创建我的模型。
我刚刚创建了两个:一个名为dto,它将成为我所有数据库模型的基础,如下所示:

public abstract class Dto
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    [Clustered]
    public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
    public DateTime LastUpdate { set; get; } 
}

另一个被调用subscription,它看起来像这样:

public class Subscription:Dto
{
    public string Name { get; set; } 
    public decimal Price { set; get; }
    public string MeliApiKey { get; set; }
    public int MaxQueries { get; set; }
    public int UsedQueries { get; set; }

}

我在以下配置Fluent API

modelBuilder.Entity<Dto.Dto>().Property(x => x.CreatedAt).HasDefaultValueSql("SYSUTCDATETIME()");
modelBuilder.Entity<Dto.Dto>().Property(x => x.LastUpdate).HasComputedColumnSql("SYSUTCDATETIME()");

foreach (var entity in modelBuilder.Model.GetEntityTypes())
{
    foreach (var prop in entity.GetProperties())
    {
        var attr = prop.PropertyInfo?.GetCustomAttribute<ClusteredAttribute>(true);
        if (attr != null)
        {
            var index = entity.AddIndex(prop);
            index.IsUnique = true;
            index.SqlServer().IsClustered = true;
        }
    }
}

我只添加了subscription一个dbset,因为我不希望 Table Per Hierarchy 继承与dto.

当我运行 add-migration 时,我收到以下错误:

“索引 {'CreatedAt'} 无法添加到实体类型 'Subscription',因为实体类型 'Dto' 上已存在相同属性的索引”

现在我已经用谷歌搜索了这个错误,但我看不到任何地方如何解决这个问题。

我应该删除dto该类并向代表我的模型的每个对象添加相同的属性吗?

标签: c#asp.net-core-2.1entity-framework-core-2.1

解决方案


如错误所述,索引已在基类的属性上定义。检查该属性是否在您当前正在处理的实体的同一类型中声明,类似于:

var propertiesToProcess = entity.GetProperties()
    .Where( p => entity.ClrType == p.PropertyInfo.DeclaringType );

推荐阅读