如何删除EF核心代码优先约定PK

问题描述

我的(EF Core 3.1)模型中的许多实体都源自相同的基本类型(HistorizedBaseEntity),因此应具有相同的PK: {int ID,Guid InstanceGuid,Instant Time}

我不必为每个实体类型重新定义此代码,而是编写了一些代码来自动处理此问题:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    foreach (var mutableEntityType in modelBuilder.Model.GetEntityTypes().ToList()) 
    {
        if (mutableEntityType.ClrType.IsSubclassOf(typeof(BaseEntity)) 
            && mutableEntityType.BaseType == null)
        {
            var mutableKeys = mutableEntityType.GetKeys().ToList();
            foreach (var mutableKey in mutableKeys)
            {
                if (mutableKey.IsPrimaryKey() && mutableKey.Properties.Count == 1 
                                                && mutableKey.Properties.First().Name == nameof(IHasId.Id))
                    mutableEntityType.RemoveKey(mutableKey);
            }
    
            if (mutableEntityType.ClrType.IsSubclassOf(typeof(HistorizedBaseEntity)) 
                && mutableEntityType.BaseType == null)
            {
                if (!mutableKeys.Any(m => m.Properties.Select(p => p.Name)
                    .ToHashSet().SetEquals(HistorizedBaseEntity.PrimaryKeyNames)))
                {
                    var keyProperties = mutableEntityType.GetProperties()
                        .Where(p => HistorizedBaseEntity.PrimaryKeyNames.Contains(p.Name)).ToList();
                    mutableEntityType.SetPrimaryKey(keyProperties);
                }
            }
        }
    }
}

HistorizedBaseEntity:

    public class HistorizedBaseEntity 
    {
        public int Id { get; set; }
        public Guid InstanceGuid { get; set; }
        public Instant Time { get; set; }

        public static IReadOnlyList<string> PrimaryKeyNames =>
            new List<string> {nameof(Id),nameof(InstanceGuid),nameof(Time)}.AsReadOnly();

    }

没有上面的代码,所有源自HistorizedBaseEntity的实体都具有一个以“ ID”作为字段的约定PK。

上面的代码运行后,我确实有2个键,约定基于一个键作为PK,而新创建的一个键作为唯一键。 通过调试,我看到RemoveKey()实际上删除了PK-然后在ConventionDispatcher.OnKeyRemoved中运行KeyDiscoveryConvention,将其重新添加回去。

如何在不禁用约定的情况下删除基于约定的PK?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...