2016-10-06 2 views
0

У меня возникла проблема с отображением свойств объектов объектов/сложных типов для сущностей. У меня есть пользовательский объект, который имеет свойство сложного типа, называемое Credential, которое, в свою очередь, имеет свойства: Email, UserName, Password и SecurityStamp. Я пытаюсь сопоставить свойство от сложного типа для лиц, а также исходный код показан ниже:Entity Framework: свойство «ComplexType.Field» не существует или не отображается для ввода «Entity»

public class User 
{ 
    public string Id { get; protected set; } 
    public Credential Credential { get; protected set; } 
    // unrelated properties and methods omitted for simplicity 
} 

public sealed class Credential: ValueObject<Credential> 
{ 
    public string Email { get; private set; } 
    public string UserName { get; private set; } 
    public string Password { get; private set; } 
    public string SecurityStamp { get; private set; } 

    public Credential() { } 

    public Credential(string email, string userName, string password, string securityStamp) 
    { 
     Email = email; 
     UserName = userName; 
     Password = password; 
     SecurityStamp = securityStamp; 
    } 

public class CoreContext: DbContext 
{ 
    public IDbSet<User> Users { get; set; } 

    public CoreContext(string connectionString) : base(connectionString) {} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer<CoreContext>(null); 

     modelBuilder.ComplexType<Credential>().Property(ucr => ucr.Email).HasColumnName("Email"); 
     modelBuilder.ComplexType<Credential>().Property(ucr => ucr.UserName).HasColumnName("UserName"); 
     modelBuilder.ComplexType<Credential>().Property(ucr => ucr.Password).HasColumnName("Password"); 
     modelBuilder.ComplexType<Credential>().Property(ucr => ucr.SecurityStamp).HasColumnName("SecurityStamp"); 

     modelBuilder.Entity<User>().Property(u => u.Credential.Email).HasColumnName("Email"); 
     modelBuilder.Entity<User>().Property(u => u.Credential.UserName).HasColumnName("UserName"); 
     modelBuilder.Entity<User>().Property(u => u.Credential.Password).HasColumnName("Password"); 
     modelBuilder.Entity<User>().Property(u => u.Credential.SecurityStamp).HasColumnName("SecurityStamp"); 
    } 
} 

Как вы видите, я пытался отобразить сложные свойства типа к объекту. Я начал с настройки Credential как сложного типа, а затем настроил свойства на пользователе пользователя. Однако, я получаю следующую ошибку:

The 'Credential.Email' property does not exist or is not mapped for the type 'User'. 

Я не понимаю, почему это происходит. Я сделал все возможное, чтобы настроить сложное отображение типов, почему это не работает? У кого-нибудь есть идеи о том, что я, возможно, сделал неправильно?

+0

u.Credential - это свойство навигации, которое вы уже сопоставили в строках ранее. удалите эти 4 последние строки, так как это НИКАКИЕ свойства объекта User. – DevilSuichiro

+0

@DevilSuichiro: Как вы сказали, такое же сообщение об ошибке, как и раньше, оно не решает проблему. –

+0

@ LordYggdrasill Вы когда-нибудь решали эту проблему? – rleffler

ответ

0

не был в состоянии воспроизвести это:

Я получил это после надстройку миграции с одной и той же установки у вас есть:

public override void Up() 
{ 
    CreateTable(
      "dbo.Users", 
      c => new 
      { 
       Id = c.String(nullable: false, maxLength: 128), 
       Email = c.String(), 
       UserName = c.String(), 
       Password = c.String(), 
       SecurityStamp = c.String() 
      }) 
     .PrimaryKey(t => t.Id); 
} 

Единственное, я удалил это ваша база class в Credential: ValueObject, потому что у меня его нет. Все выглядит хорошо, поэтому, возможно, что-то не так с этим классом?

+0

Я не думаю, что что-то не так с классом ValueObject, по крайней мере, не с точки зрения сопоставления. Он имеет только несколько методов, но никаких свойств/полей. –