EF核心自定义约定和代理

时间:2018-05-31 15:39:28

标签: c# entity-framework-core ef-core-2.0

我在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禁用错误。

1 个答案:

答案 0 :(得分:3)

正如错误消息所示,无法为派生类型配置PK(可能来自实体继承策略映射,显然现在也是代理类型,尽管后者可能是错误)。

EF Core中的哪些术语(以及EF Core内部KeyAttributeConvention的源代码)表示EntityType.BaseType == null等适用标准。

所以您需要的是修改if条件,如下所示:

if (entityTypeBuilder.Metadata.HasClrType() && entityTypeBuilder.Metadata.BaseType == null)