2015-05-19 2 views
0

Я пытаюсь экспортировать классы Identity Asp.Net в метаданные OData. Теперь класс IdentityUserLogin содержит три первичных ключа, которые не отмечены атрибутом [Key]. Когда метаданные генерируется, ключ определение отсутствует в выводеПовторяющиеся столбцы в метаданных odata

<EntityType Name="IdentityUserLogin"> 
    <Property Name="LoginProvider" Type="Edm.String"/> 
    <Property Name="ProviderKey" Type="Edm.String"/> 
    <Property Name="UserId" Type="Edm.String"/> 
</EntityType> 

Обычно, чтобы исправить это все, что мне нужно сделать, это добавить ключи manully используя 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.

ответ

1

Существует способ избежать упомянутой ошибки here и here, если вы получите идентификационные данные - например, для того, чтобы иметь разные типы ключей. Поскольку я получаю все типы удостоверений, и соответствующие свойства являются виртуальными, я могу переопределить свойства ключа, задав атрибут [Key]. Таким образом, мне не нужно явно определять ключи и, таким образом, избежать ошибки duplicate-property-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; } 
    } 
} 

С уважением, Kasimier Buchcik

1

Вам необходимо явно настроить модель, поэтому вы должны использовать вместо ODataConventinalModelBuilder, и не будет повторяющихся свойств.

+0

Он работает, но теперь мне нужно, чтобы построить всю свою модель с ключами, отношений и валидаций вручную. Он работает, если вам нужно много контролировать свою экспортированную модель, но для этой ситуации это означает двойную работу, поскольку метаданные уже определены в модели. – Ayman

+1

Обычно мы не рекомендуем использовать 'ODataConventionModelBuilder' и настраивать модель вместе, но то, что вы хотите достичь, является правильным сценарием, и это [ошибка] (https://github.com/OData/WebApi/issues/ 217), что существуют повторяющиеся свойства, но это исправление ошибки является нарушением изменений для OData WebAPI, вы можете следить за этой ошибкой, и запрос на передачу оценивается :) –

Смежные вопросы