odata 元数据中的重复列

Duplicate columns in odata metadata

我正在尝试导出 OData 元数据中的 Asp.Net 身份 classes。现在 IdentityUserLogin class 包含三个未标记 [Key] 属性的主键。生成元数据时,输出中缺少键定义

<EntityType Name="IdentityUserLogin">
  <Property Name="LoginProvider" Type="Edm.String"/>
  <Property Name="ProviderKey" Type="Edm.String"/>
  <Property Name="UserId" Type="Edm.String"/>
</EntityType>

通常,要解决这个问题,我需要做的就是使用 HasKey 方法手动添加密钥,就像这样

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

builder.EntitySet<IdentityUserLogin>("Logins").EntityType
  .HasKey(l => new { l.LoginProvider, l.ProviderKey, l.UserId });

var EDM = builder.GetEdmModel();

config.Routes.MapODataServiceRoute("odata", "api", EDM, 
  new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

虽然上面生成了实体的键定义,但它也创建了重复的列

<EntityType Name="IdentityUserLogin">
  <Key>
    <PropertyRef Name="LoginProvider"/>
    <PropertyRef Name="ProviderKey"/>
    <PropertyRef Name="UserId"/>
  </Key>
  <Property Name="LoginProvider" Type="Edm.String" Nullable="false"/>
  <Property Name="ProviderKey" Type="Edm.String" Nullable="false"/>
  <Property Name="UserId" Type="Edm.String" Nullable="false"/>
  <Property Name="LoginProvider" Type="Edm.String"/>
  <Property Name="ProviderKey" Type="Edm.String"/>
  <Property Name="UserId" Type="Edm.String"/>
</EntityType>

我是不是做错了什么?请注意,IdentityUserRole class.

也会发生这种情况

您需要显式配置模型,因此您应该使用 ODataModelBuilder 而不是 ODataConventinalModelBuilder,并且不会有重复的属性。

有一种方法可以避免提到的错误 here and here,如果派生身份类型 - 例如为了有不同类型的钥匙。 由于我派生了所有身份类型并且相关属性是虚拟的,因此我能够覆盖键属性并设置 [Key] 属性。因此我不需要显式定义键,从而可以避免重复的-属性-bug.

public class UserLogin : MultitenantIdentityUserLogin<Guid, Guid>
{
    [Key]
    public override Guid TenantId
    {
        get { return base.TenantId; }
        set { base.TenantId = value; }
    }

    [Key]
    public override string LoginProvider
    {
        get { return base.LoginProvider; }
        set { base.LoginProvider = value; }
    }

    [Key]
    public override string ProviderKey
    {
        get { return base.ProviderKey; }
        set { base.ProviderKey = value; }
    }

    [Key]
    public override Guid UserId
    {
        get { return base.UserId; }
        set { base.UserId = value; }
    }
}

public class UserRole : IdentityUserRole<Guid>
{
    [Key]
    public override Guid UserId
    {
        get { return base.UserId; }
        set { base.UserId = value; }
    }

    [Key]
    public override Guid RoleId
    {
        get { return base.RoleId; }
        set { base.RoleId = value; }
    }    
}

public class UserClaim : IdentityUserClaim<Guid>
{
    [Key]
    public override int Id
    {
        get { return base.Id; } 
        set { base.Id = value; }
    }
}

此致, 卡西米尔布奇克