これは、Entity Framework 4 (4.3.1) と 5 の両方に当てはまります。
User クラスがあります (Entity Framework MembershipProvider と一緒に使用します)。簡単にするために、一部のプロパティを削除しました。実際の User は MVCBootstrap プロジェクトのものであるため、他のクラスと同じアセンブリの一部ではありません。
public class User {
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[StringLength(256)]
public String Username { get; set; }
}
そして、私はこのクラスを持っています:
public class NewsItem {
public Int32 Id { get; set; }
[Required]
[StringLength(100)]
public String Headline { get; set; }
[Required]
public virtual User Author { get; set; }
[Required]
public virtual User LastEditor { get; set; }
}
次に、データベース コンテキストを作成します (ユーザーの DbSet は MembershipDbContext にあります)。
public class MyContext : MVCBootstrap.EntityFramework.MembershipDbContext {
public MyContext(String connectString) : base(connectString) { }
public DbSet<NewsItem> NewsItems { get; set; }
}
このコードを実行すると、データベースの作成時に次の例外が発生します。
テーブル 'WebShop' に FOREIGN KEY 制約 'FK_dbo.WebShop_dbo.User_LastEditor_Id' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。以前のエラーを参照してください。
そこで、データベース コンテキストを変更します。
public class MyContext : MVCBootstrap.EntityFramework.MembershipDbContext {
public MyContext(String connectString) : base(connectString) { }
public DbSet<NewsItem> NewsItems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.Add(new NewsItemConfiguration());
}
}
そして、この構成:
public class NewsItemConfiguration : EntityTypeConfiguration<NewsItem> {
public NewsItemConfiguration() {
HasRequired(n => n.Author).WithOptional();
HasRequired(n => n.LastEditor).WithOptional();
}
}
それともこれは間違っていますか?
とにかく、コードを実行すると、データベースが作成され、データベースは問題ないように見えます (外部キー制約などを調べます)。
しかし、その後、コンテキストから 10 個の最新の NewsItem を取得し、それらをビュー モデルにロードし始めます。これの一部は、NewsItem の Author プロパティにアクセスすることです。これを行うコントローラーは、ロードに永遠に時間がかかり、長い間失敗します。デバッグモードで実行すると、このコードで例外が発生します: this.AuthorId = newsItem.Author.Id;
、次に取得する例外は次のとおりです:
関係の多重度制約違反が発生しました: EntityReference は複数の関連オブジェクトを持つことはできませんが、クエリは複数の関連オブジェクトを返しました。これは回復不可能なエラーです。
おそらく、私が間違っているのは単純で愚かなことです。複数のサイトで同様のコードを実行していると確信しています..これは何が原因ですか? 私のモデルは間違っていますか、それはデータベースのコンテキストですか、それとも?