2017-02-18 5 views
1

私の最初の質問stackoverflow.com! 2つのフィールドに一致する必要、私がいくつかのテストデータを持つ開発データベースをシードしようとしています:)複数のフィールドでAddOrUpdateのマッチを使用してASP.NET MVCをシードしている間に `このコンテキストではプリミティブ型または列挙体のみがサポートされています 'エラー

説明幸運を願い、そして

How to seed data with AddOrUpdate with a complex key in EF 4.3は私がOnly primitive types or enumeration types are supported in this context.エラーas mentioned in the comments by lukyerを取得し、ここで解決される問題が発生しました。

しかし、外部キー属性と必要な属性をモデルのプロパティに追加しても、エラーをクリアする明白な方法は見つけられません。

データベースを正常にシードする方法については、感謝の意を表します。次のように

モデルの重要な部分は、以下のとおりです。

public class User { 
    public string ID { get; set; } 
    public string Email {get; set; } 
} 

public class Institution { 
    public Guid ID { get; set;} 
    public string Name {get; set; } 
} 

public class UserInstitutionAssociation { 
    public Guid ID { get; set; } 
    public virtual User User { get; set; } 
    public virtual Institution Institution {get; set;} 
} 

そしてconfiguration.csから移行するためのコードは、ユーザー([email protected])と機関(トップシークレットの確立)を追加します。次に、ユーザーと施設との間の関連付けを追加しようとします。これは、これら2つの間の関連がまだ存在しない場合にのみ追加する必要があります。私が提案しているようにLukyerを理解するように私はここに要するにHow Should I Declare Foreign Key Relationships Using Code First Entity Framework (4.1) in MVC3?

を説明したすべてのソリューションを含む、いくつかの方法でモデルを変更しようとしている

//Add User to Database 
context.Users.AddOrUpdate(u => u.Email, 
    new User { 
     Email = "[email protected]" 
    }); 
context.SaveContext(); 

//Add Institution to Database 
context.Institutions.AddOrUpdate(u => u.Name, 
    new Institution { 
     Name = "Top Secret Establishment" 
    }); 
context.SaveContext(); 

//Add Association between User and Institution 
context.InstitutionUserAssociations.AddOrUpdate(u => new { u.User, u.Institution }, 
    new InstitutionUserAssociation 
    { 
     User = context.Users.Single(x => x.Email=="[email protected]"), 
     Institution = context.Institutions.Single(x => x.Name=="Top Secret Establishment") 
    } 
); 
context.SaveContext(); 

、私は成功せず、次のすべての組み合わせを試してみました:

public class UserInstitutionAssociation { 
    public Guid ID { get; set; } 
    [Required] 
    [ForeignKey("UserID")] 
    public virtual User User { get; set; } 
    [Required] 
    [ForeignKey("InstitutionID")] 
    public virtual Institution Institution {get; set;} 
} 

public class UserInstitutionAssociation { 
    public Guid ID { get; set; } 
    [Required] 
    [ForeignKey("User")] 
    public string UserID {get; set; } 
    public virtual User User { get; set; } 

    [Required] 
    [ForeignKey("Institution")] 
    public Guid InstitutionID { get; set; } 
    public virtual Institution Institution {get; set;} 
} 

答えて

1

解決済み。 LINQクエリの一部として含まれているクラスのために発生しました。 x.Userとx.Institutionは両方とも複合クラスであるため、x => new { x.User, x.Institution}は使用できません。代わりに、これらは基本的な基本型(文字列やGuidなど)である必要があります。このように変更されましたAddOrUpdate(x => new {x.UserID, x.InstitutionID}, Associations)。モデルを変更する必要があったため、LINQによって照会できるUserIDとInstitutionIDというプロパティが含まれていました。

次のように特性がユーザIDとInstitutionIDと呼ばれるだけでなく、ユーザーとI含まれるので、私はUserInstitutionAssociationコード調整:

public class UserInstitutionAssociation { 
    public Guid ID { get; set; } 

    [Required] 
    [ForeignKey("User")] 
    public string UserID {get; set; } 
    public virtual User User { get; set; } 

    [Required] 
    [ForeignKey("Institution")] 
    public Guid InstitutionID { get; set; } 
    public virtual Institution Institution {get; set;} 
} 

そして次のようにAddOrUpdate呼び出しを調整:

//Add Association between User and Institution 
context.InstitutionUserAssociations.AddOrUpdate(u => new { u.UserID, u.InstitutionID }, 
    new InstitutionUserAssociation 
    { 
     User = context.Users.Single(x => x.Email=="[email protected]"), 
     Institution = context.Institutions.Single(x => x.Name=="Top Secret Establishment") 
    } 
); 
関連する問題