EF 4.0.0 から EF 4.3.1 にアップグレードしました。Windows XP で Visual Studio 2010 Ultimate を使用しており、最新リリースに更新され、すべての Windows 更新プログラム/パッチが適用されています。私が使用しているデータベース エンジンは SQL Server 2008 R2 Developers Edition です。次のコードは、EF 4.0.0 では完全に機能しますが、EF 4.3.1 では機能しません。
public class ItemBase
{
public DateTime Created { get; set; }
public int CreatedByUserID { get; set; }
public DateTime LastModified { get; set; }
public int LastModifiedByUserID { get; set; }
public User CreatedBy { get; set; }
public User LastModifiedBy { get; set; }
public ItemBase()
{
CreatedByUserID = -1;
LastModifiedByUserID = -1;
CreatedBy = null;
LastModifiedBy = null;
}
}
public class User : ItemBase
{
public int UserID { get; set; }
public string LoginName { get; set; }
public string Password { get; set; }
public string EmailAddress { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public string DisplayName { get; set; }
public User() : base()
{
UserID = -1;
LoginName = String.Empty;
Password = String.Empty;
EmailAddress = String.Empty;
Firstname = String.Empty;
Lastname = String.Empty;
DisplayName = String.Empty;
}
}
protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().Property(u => u.UserID).HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);
}
変更された唯一のことは、使用している Entity Framework のバージョンです。参照などを確認しましたが、すべてが期待どおりです。
上記のコードからわかるように、User クラスは ItemBase から継承し、ItemBase は User インスタンスへの参照を持ちます。基になる User テーブルには、User クラスと ItemBase クラスのすべてのプロパティが含まれます (2 つのナビゲーション プロパティ public User CreatedBy { get; set; } と public User LastModifiedBy { get; set; } を除く)。このコードを 4.0.0 で実行する単一の問題や問題ではなく、すべてが期待どおりに機能します。
しかし、4.3.1 で同じコードを実行すると (使用しているデータベースを含め、他のものに変更を加えずに)、次のエラーが発生します。
「タイプ 'User' と 'User' の間の関連付けのプリンシパル エンドを特定できません。この関連付けのプリンシパル エンドは、リレーションシップ fluent API またはデータ アノテーションのいずれかを使用して明示的に構成する必要があります。」
そこで、次の 2 行を OnModelCreating メソッドに追加しました。
modelBuilder.Entity<User>().HasRequired(u => u.CreatedBy).WithMany().HasForeignKey(k => k.CreatedByUserID);
modelBuilder.Entity<User>().HasRequired(u => u.LastModifiedBy).WithMany().HasForeignKey(k => k.LastModifiedByUserID);
次に、これらの奇妙なエラーが発生します。
"プロバイダーは ProviderManifestToken 文字列を返しませんでした。 "
" SQL Server への接続を確立しているときに、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: SQL ネットワーク インターフェイス、エラー: 26 - 指定されたサーバー/インスタンスの検索エラー) "
また、出力ウィンドウにこれらのエラーが何度も表示されることに気付きました。
ただし、これらのエラーは、データベースに問題がなく、利用可能であり、接続文字列も完璧であるため、少し厄介なようです。その後、OnModelCreating メソッドへの変更を元に戻すと、元のエラーが再び表示されるため、ここで発生している根本的な問題が実際に表示されるエラー メッセージに反映されているとは思えません。
したがって、これらすべてに基づいて、次の結論に達します。
- Entity Framework のバージョン 4.3.1 にバグがありますか?
- 私のコードが OnModelCreating メソッドの余分な 2 行なしで 4.0.0 の下で機能したという事実は、おそらく 4.0.0 で行われなかったチェックが原因で、その後 4.3.1 で行われているのでしょうか?
- 構成/コードに何か特別なものを追加する必要がありますか、それとも 4.3.1 でこれを再び機能させるには何か不足していますか?
誰かが私のためにこれに光を当てることができますか? それは私を夢中にさせます!これについてお時間をいただきありがとうございます。よろしくスティーブ