6

2 つの POCO クラス (以下) があり、2 つのレコード間のリンクを削除したいと考えています。このEF 5.0によると、次のように User クラスをロードせずに削除を処理できるはずです。

context.Computers.Find("test").User = null;
context.SaveChanges();

これは機能しませんが、.net 4 承認済みの方法を使用すると機能します。

en = context.Computers.Find("test");
context.Entry(en).Reference(e => e.User).Load();
en.User = null;
context.SaveChanges();

私の EF リファレンスは EntityFramework.dll バージョン 5.0.0.0 です。ここで明らかな何かが欠けていますか?

クラスは次のとおりです。

public class Computer
{
    public string Id { get; set; }
    public Nullable<int> UserId { get; set; }
    public virtual User User { get; set; }
}
public class User
{
    public int Id { get; set; }
    public virtual ICollection<Computer> Computers { get; set; }
}

編集:上記のリンクされた記事の特定の行は、私が見ている機能と一致していないようです:

リレーションシップを削除するには、ナビゲーション プロパティを null に設定します。.NET 4.0 に基づく Entity Framework を使用している場合は、関連する end を null に設定する前に読み込む必要があります。例えば:

context.Entry(course).Reference(c => c.Department).Load();
course.Department = null;

.NET 4.5 に基づく Entity Framework 5.0 以降では、関連する end を読み込まずに関係を null に設定できます。

4

2 に答える 2

1

編集:

コメントを読んだだけで(おそらく最初に読んだはずですが、すでに書いているので、そのままにしておきます)、皆さんがかなり似たような結論に達したのを見てください。これが理由の説明に役立つことを願っています。また、補足として、FK idプロパティを使用して関係をnullにする方がよいと思います。これは、リモートエンティティを実際にロードする必要がないことを意味します。


ねえ、私はこれが起こっていることだと思います:

コンピューターエンティティをロードします

  • この時点で、ユーザーナビゲーションプロパティはnullです。
  • 追跡グラフでは、このエンティティの初期状態がnullに設定されています

Userプロパティをnullに設定します

  • トラッキンググラフはまだnullに設定されているため、意図的なnullとロードされていないnullの違いを区別できません

変更を保存します

  • トラッカーは初期グラフを調べ、ユーザープロパティがまだロードされていないことを確認し、nullをアンロードされた初期状態として扱います。
  • 変更は保持されません

私が見ているようにこれが当てはまる場合、EFにこれを変更として検出させる(したがって、関係を削除する)には、2つの異なる方法があります。

  1. 関係をnullに設定する前にユーザーを強制的に読み込む場合は、遅延読み込みを有効にしてアクセスするか、クエリで.Include構文を使用してこれを行うことができます。
  2. 代わりに、UserIdプロパティをnullに設定してください

2つ目ははるかに簡単で、ユーザーIDプロパティがリモートエンティティにないため機能するはずです。EFは、nullnavプロパティまたはnullFKのいずれかを変更として扱い、削除を実行します。

于 2013-01-25T06:21:36.420 に答える