2016-10-06 3 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"); 
    } 
} 

見ての通り、私はエンティティに複合型のプロパティをマップしようとしていました。私は、資格情報を複合タイプとして設定し、次にエンティティユーザーのプロパティを設定することから始めました。ただし、次のエラーが表示されます。

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); 
} 

を、私は、これは後に、あなたが持っている同じ設定で移行を追加するんです私がそれを持っていないので、Credential:ValueObjectのクラス。すべてがうまく見えるので、そのクラスに何か問題がありますか?

+0

私は、少なくとも、マッピングに関しては、ValueObjectクラスに何も問題がないと思っていません。いくつかのメソッドしかありませんが、プロパティやフィールドはありません。 –

関連する問題