odata元数据中的重复列

时间:2015-05-19 03:36:50

标签: entity-framework odata asp.net-identity

我正在尝试在OData元数据中导出Asp.Net Identity类。现在,IdentityUserLogin类包含三个未标记[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类。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

有一种方法可以避免提到herehere的错误,如果一个人派生出身份类型 - 例如为了拥有不同类型的钥匙。 由于我派生所有标识类型并且相关属性是虚拟的,因此我能够覆盖键属性并设置[Key]属性。因此,我不需要明确定义密钥,因此可以避免重复属性错误。

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; }
    }
}

此致 Kasimier Buchcik