2

私はこのドメインを持っています:

public class Phone {
    public int Id { get; set; }
    public string Number { get; set; }
    public Person Person { get; set; }
}
public class Person {
    public int Id { get; set; }
    public IList<Phone> Phones { get; set; }
}

をロードしPersonてクリアしPhonesます。ただし、操作によってエラーが発生します。

// actually loads person from repository...
var person = _personRepository.Include(p => p.Phones).Where(p => p.Id == 1).First();
person.Phones.Clear();
_personRepository.Update(person);

Person上に、をロードしてクリアするという単純化されたロジックを示しPhonesます。ただし、次のエラーが発生します。

操作が失敗しました:1つ以上の外部キープロパティがnull許容でないため、関係を変更できませんでした。リレーションシップに変更が加えられると、関連する外部キープロパティがnull値に設定されます。外部キーがnull値をサポートしていない場合は、新しい関係を定義するか、外部キープロパティに別の非null値を割り当てるか、関連のないオブジェクトを削除する必要があります。

Person.Phones実は全部クリアして新しいアイテムを追加したいです。ただし、1つずつ削除するのではなく、1つのクエリでクリアしたいと思います。

何か考えはありますか?手伝ってくれませんか。前もって感謝します。

4

2 に答える 2

1

EF でセット ベースの SQL を生成することはできません。Phoneそのため、指定されたすべてのレコードを削除する単一の SQL ステートメントを EF で生成する方法はありませんPerson.Id

SQL を自分で記述し、モデルに応じてObjectContext.ExecuteStoreCommandまたはDbContext.Database.ExecuteSqlCommandに渡すことができます。

于 2012-05-12T16:22:17.943 に答える
0
foreach(var phone in person.Phones)
{
   context.DeleteObject(phone);
}
person.Phones.Clear();

役立つかもしれません。

于 2012-05-12T17:15:27.730 に答える