我在ef-core 2.1中创建了一个自定义IEntityTypeAddedConvention,并通过调用UseLazyLoadingProxies方法启用了LazyLoadingProxies。 我的自定义约定是一个将复合键添加到模型的类,如下所示:
public class CompositeKeyConvetion : IEntityTypeAddedConvention
{
public InternalEntityTypeBuilder Apply(InternalEntityTypeBuilder entityTypeBuilder)
{
Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder));
if (entityTypeBuilder.Metadata.HasClrType())
{
var pks = entityTypeBuilder
.Metadata
.ClrType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.IsDefined(typeof(CompositeKeyAttribute), false))
.ToList();
if (pks.Count > 0)
{
entityTypeBuilder.PrimaryKey(pks, ConfigurationSource.Convention);
}
}
return entityTypeBuilder;
}
}
所有事情都很完美,但有时我会收到错误:
无法在'PermitPublicationProxy'上配置密钥,因为它是a 派生类型。必须在根类型上配置密钥 'PermitPublication'。如果你不打算'PermitPublication'来 包含在模型中,确保它不包含在DbSet中 您在上下文中的属性,在配置调用中引用 模型构建器,或从类型上的导航属性引用 包含在模型中。 如果未显示LazyLoadingProxy禁用错误。
答案 0 :(得分:3)
正如错误消息所示,无法为派生类型配置PK(可能来自实体继承策略映射,显然现在也是代理类型,尽管后者可能是错误)。
EF Core中的哪些术语(以及EF Core内部KeyAttributeConvention的源代码)表示EntityType.BaseType == null
等适用标准。
所以您需要的是修改if
条件,如下所示:
if (entityTypeBuilder.Metadata.HasClrType() && entityTypeBuilder.Metadata.BaseType == null)