首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据元数据中的重复列

数据元数据中的重复列
EN

Stack Overflow用户
提问于 2015-05-19 03:36:50
回答 2查看 464关注 0票数 0

我试图在Asp.Net元数据中导出OData标识类。现在,IdentityUserLogin类包含三个没有用[Key]属性标记的主键。生成元数据时,输出中缺少键定义。

代码语言:javascript
复制
<EntityType Name="IdentityUserLogin">
  <Property Name="LoginProvider" Type="Edm.String"/>
  <Property Name="ProviderKey" Type="Edm.String"/>
  <Property Name="UserId" Type="Edm.String"/>
</EntityType>

通常,要修复这个问题,我所需要做的就是使用HasKey方法添加密钥,如下所示

代码语言:javascript
复制
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));

在上面为实体生成键定义的同时,它还会创建重复的列。

代码语言:javascript
复制
<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类也会发生这种情况。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-29 21:42:55

有一种方法可以避免提到的这里这里错误,如果一个人派生身份类型--例如,为了有不同类型的密钥。因为我派生出所有标识类型并且相关属性是虚拟的,所以我能够覆盖键属性--一组键属性。因此,我不需要显式地定义键,因此可以避免重复的属性错误。

代码语言:javascript
复制
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; }
    }
}

你好,卡西米尔·布奇切克

票数 1
EN

Stack Overflow用户

发布于 2015-05-27 03:17:05

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30316344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档