odata 元数据中的重复列
Duplicate columns in odata metadata
我正在尝试导出 OData 元数据中的 Asp.Net 身份 classes。现在 IdentityUserLogin
class 包含三个未标记 [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
class.
也会发生这种情况
您需要显式配置模型,因此您应该使用 ODataModelBuilder
而不是 ODataConventinalModelBuilder
,并且不会有重复的属性。
有一种方法可以避免提到的错误 here and here,如果派生身份类型 - 例如为了有不同类型的钥匙。
由于我派生了所有身份类型并且相关属性是虚拟的,因此我能够覆盖键属性并设置 [Key] 属性。因此我不需要显式定义键,从而可以避免重复的-属性-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; }
}
}
此致,
卡西米尔布奇克
我正在尝试导出 OData 元数据中的 Asp.Net 身份 classes。现在 IdentityUserLogin
class 包含三个未标记 [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
class.
您需要显式配置模型,因此您应该使用 ODataModelBuilder
而不是 ODataConventinalModelBuilder
,并且不会有重复的属性。
有一种方法可以避免提到的错误 here and here,如果派生身份类型 - 例如为了有不同类型的钥匙。 由于我派生了所有身份类型并且相关属性是虚拟的,因此我能够覆盖键属性并设置 [Key] 属性。因此我不需要显式定义键,从而可以避免重复的-属性-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; }
}
}
此致, 卡西米尔布奇克