0

さまざまなエンティティのプロパティを定義するエンティティがあります。

例えば。

class user{
ICollection<PropertyEntity> properties {get;set;}
}

class company{
ICollection<PropertyEntity> properties {get;set;}
}

User または Company から PropertyEntity を削除したとき。

myUser.properties.Remove(someProperty);

PropertyEntity は削除されません。外部キーが null に設定されているだけです。

[Key] アノテーションを使用して外部キーを定義できることは理解しています。しかし、おそらく、どちらかではなく両方のキーが必要になるでしょうか?

ユーザーまたは会社のいずれかが多くの PropertyEntity を持つことができるように、EF にその関係を構築させるにはどうすればよいですか。しかし、ユーザーまたは会社がない場合、PropertyEntity は削除されますか?

4

1 に答える 1

0

リレーションシップがオプションの場合、ナビゲーション コレクションから子を削除するとデータベースからも削除されるようにリレーションシップを定義する方法はありません。

DbSet<T>.Removeあなたは子供を呼ぶ必要があります...

myUser.properties.Remove(someProperty);
if (!someProperty.CompanyId.HasValue)
    context.PropertyEntities.Remove(someProperty);

... (コレクションから子も自動的に削除されます) またはSaveChanges、変更がコミットされる前に、オーバーライドされた「孤立した」子を削除しようとすることができます。

public override int SaveChanges()
{
    PropertyEntities.Local
        .Where(p => !p.UserId.HasValue && !p.CompanyId.HasValue)
        .ToList()
        .ForEach(p => PropertyEntities.Remove(p));

    return base.SaveChanges();
}

このアプローチについては、 Arthur Vickers のブログで詳しく説明されています。

識別関係(子がナビゲーション コレクションから削除されたときにデータベースから削除されることをサポートする) を設定することは、実際には関係が必要な場合にのみ可能であるため、オプションではありません。

于 2013-07-17T16:56:25.040 に答える