1

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 メソッドへの変更を元に戻すと、元のエラーが再び表示されるため、ここで発生している根本的な問題が実際に表示されるエラー メッセージに反映されているとは思えません。

したがって、これらすべてに基づいて、次の結論に達します。

  1. Entity Framework のバージョン 4.3.1 にバグがありますか?
  2. 私のコードが OnModelCreating メソッドの余分な 2 行なしで 4.0.0 の下で機能したという事実は、おそらく 4.0.0 で行われなかったチェックが原因で、その後 4.3.1 で行われているのでしょうか?
  3. 構成/コードに何か特別なものを追加する必要がありますか、それとも 4.3.1 でこれを再び機能させるには何か不足していますか?

誰かが私のためにこれに光を当てることができますか? それは私を夢中にさせます!これについてお時間をいただきありがとうございます。よろしくスティーブ

4

1 に答える 1

2

EF4.1のプレリリースバージョンを使用しているようです。おそらくCTP4またはCTP5。これは明らかです:

  • ModelBuilderは、4.1RTMより前にDbModelBuilderに名前が変更されました
  • DatabaseGenerationOptionはDatabaseGeneratedOptionに名前が変更されました
  • あなたが見ている例外は、EF4.1がRTMされる前に導入されました

これを考えると、使用していたプレリリースバージョンでどのモデルが作成されているのか100%わかりません。4.1以降では、2つのナビゲーションプロパティが互いに逆に検出され、Code Firstはユーザーとユーザーの間に1:1の関係を作成しようとします。Code Firstは、この関係のプリンシパルを判別できないため、推測するのではなく、提供するように求めます。

ただし、モデルを見ると、これがとにかく必要なものではないことは明らかです。2つの1:*単方向ナビゲーションプロップが必要になる可能性がはるかに高いようです。1つはCreatedBy用、もう1つはLastModifiedBy用です。これは、OnModelCreating呼び出しで設定したものです。

4.1 / 4.3に一致するようにクラスの名前に変更を加え、OnModelCreatingにコードを追加すると、EF4.3.1でコードが正常に機能します。

接続できないということに関しては、接続文字列が正しいとおっしゃっていますが、その場合はEFが見つからない場合に違いありません。app.configにあると仮定すると、その名前をDbContextコンストラクターに渡す必要があります。例えば:

public class MyContext : DbContext
{
    public MyContext()
     : base("name=MyConnectionStringName")
    {
    }
}

他の方法で接続文字列を使用している場合は、その詳細が必要になります。

于 2012-04-22T16:19:10.250 に答える