Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework odata元数据中存在重复列_Entity Framework_Odata_Asp.net Identity - Fatal编程技术网

Entity framework odata元数据中存在重复列

Entity framework odata元数据中存在重复列,entity-framework,odata,asp.net-identity,Entity Framework,Odata,Asp.net Identity,我正在尝试导出OData元数据中的Asp.Net标识类。现在,IdentityUserLogin类包含三个主键,它们没有标记[Key]属性。生成元数据时,输出中缺少键定义 <EntityType Name="IdentityUserLogin"> <Property Name="LoginProvider" Type="Edm.String"/> <Property Name="ProviderKey" Type="Edm.String"/> &l

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

<EntityType Name="IdentityUserLogin">
  <Property Name="LoginProvider" Type="Edm.String"/>
  <Property Name="ProviderKey" Type="Edm.String"/>
  <Property Name="UserId" Type="Edm.String"/>
</EntityType>
在上面生成实体的键定义的同时,还创建了重复的列

<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
类也会发生这种情况。

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

有一种方法可以避免上述错误,如果派生出标识类型-例如,为了拥有不同类型的密钥。 由于我派生所有标识类型,并且相关属性都是虚拟的,因此我能够覆盖键属性并设置[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; }
    }
}
public类UserLogin:MultitenantIdentityUserLogin
{
[关键]
公共覆盖Guid租户
{
获取{return base.TenantId;}
set{base.TenantId=value;}
}
[关键]
公共覆盖字符串登录提供程序
{
获取{return base.LoginProvider;}
set{base.LoginProvider=value;}
}
[关键]
公共重写字符串提供程序密钥
{
获取{return base.ProviderKey;}
设置{base.ProviderKey=value;}
}
[关键]
公共覆盖Guid用户ID
{
获取{return base.UserId;}
设置{base.UserId=value;}
}
}
公共类用户角色:IdentityUserRole
{
[关键]
公共覆盖Guid用户ID
{
获取{return base.UserId;}
设置{base.UserId=value;}
}
[关键]
公共覆盖Guid RoleId
{
获取{return base.RoleId;}
设置{base.RoleId=value;}
}    
}
公共类UserClaim:IdentityUserClaim
{
[关键]
公共覆盖int-Id
{
获取{return base.Id;}
set{base.Id=value;}
}
}
问候,,
Kasimier Buchcik

它可以工作,但现在我需要手动构建包含键、关系和验证的整个模型。如果您需要对导出的模型进行大量控制,那么它可以工作,但在这种情况下,这意味着要加倍工作,因为元数据已经在模型中定义。通常我们不鼓励使用
ODataConventionModelBuilder
并一起配置模型,但您希望实现的是正确的场景,这是因为存在重复的属性,但是这个bug的修复对于ODataWebAPI来说是一个突破性的改变,您可以跟踪这个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; }
    }
}