2012-05-12 27 views
1

に関連するエンティティを削除します。しかし、操作がエラーを起こす:は、私は、このドメインを持つ1対多の関係

// 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をクリアするsimpledロジックを見ることができます。しかし、このエラーが発生します。

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

実は私はPerson.Phonesのすべてをクリアして、いくつかの新しいアイテムを追加します。しかし、私は1つのクエリでそれらをクリアし、1つずつ削除しないことを望みます。

ご存知ですか?私を助けてくれますか?前もって感謝します。

+0

あなたはそれをGoogleにしましたか?これについて多くの質問と回答があります。 – Eranga

+0

外部キーをnullに設定する必要があるようです。 FKはintまたはintとしてリストされていますか? –

+0

@エランガ私はそれをgoogled。 'Phones'を繰り返して一つずつ削除する方法がいくつかあります!しかし、「NH」では、私が上に示したようにこれを非常に簡単に行うことができます。私は 'EF'で同じ方法を求めています。 –

答えて

1

EFでセットベースのSQLを生成することはできません。したがって、Person.Idを指定したすべてのPhoneレコードを削除する単一のSQL文をEFに生成する方法はありません。

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

+0

これは唯一の可能性のある方法です。私は以前にそれをやった。とにかくありがとう –

0
foreach(var phone in person.Phones) 
{ 
    context.DeleteObject(phone); 
} 
person.Phones.Clear(); 

が役に立ちます。