Entity framework odata元数据中存在重复列
我正在尝试导出OData元数据中的Asp.Net标识类。现在,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
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; }
}
}