我正在尝试在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
类。
答案 0 :(得分:1)
您需要明确配置模型,因此您应该使用ODataModelBuilder
而不是ODataConventinalModelBuilder
,并且不会有重复的属性。
答案 1 :(得分:1)
有一种方法可以避免提到here和here的错误,如果一个人派生出身份类型 - 例如为了拥有不同类型的钥匙。 由于我派生所有标识类型并且相关属性是虚拟的,因此我能够覆盖键属性并设置[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