2

理解を深めるために、いくつかの単純なエンティティを作成します。

public class Room
{
    [Required]
    public int Id { get; set; }

    [Required]
    public int Name { get; set; }

    [Required]
    [Column("House_Id")]
    public int HouseId { get; set; }
    public virtual House House { get; set; }
}


public class House
{
    [Required]
    public int Id{ get; set; }

    public string Name { get; set; }

    public virtual ICollection<Room> Rooms { get; set; }
}

ここで、データベースに関連する 4 つの部屋を持つ 1 つの House エンティティがあるとします。家を更新し、2 つの部屋を削除したいと考えています。私はAsp.Net MVC4ところで使用しています。

        var house = HouseRepository.Get(id);
        house.Name = model.Name; // Some string
        house.Name = model.Rooms; // ICollection<Room> from view with 2 rooms in it, cuz user deleted other two in view
        HouseRepository.SaveChanges();
        return house;

何が起こるかというと、「The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable.」というエラーが表示されます。リレーションシップに変更が加えられると、関連する外部キー プロパティが null 値に設定されます。外部キーが null 値をサポートしていない場合は、新しい関係を定義するか、外部キー プロパティに別の非 null 値を割り当てるか、関連のないオブジェクトを削除する必要があります。

無関係な部屋をデータベースから削除する方法を見つける必要があります。いつ、どこでやればいいですか?私はすでに何かを試しましたが、今は部屋を追加していてもそのエラーが発生します。

これらの部屋を単独で削除する必要があることを EF に伝える簡単な方法はありますか?

4

3 に答える 3

1

EF は、識別関係を使用する場合にのみ、オーファンを自動的に削除できます。Roomと で構成されるオブジェクトの複合キーを定義する必要がありIdますHouseID

modelbuilder.Entity<Room>()
            .HasKey(o => new { o.ID, o.HouseId });

modelbuilder.Entity<Room>()
            .Property(o => o.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

この構成により、EF は、Roomsコレクションからルーム オブジェクトを削除するときに、DB のルームも安全に削除できることを認識しています。

于 2013-10-22T08:57:56.813 に答える
0

現在 4 つの部屋が関連付けられている 1 つの家のセットアップを想定すると、これは機能するはずです。

var db = new TestContext();
var house = db.Houses.Include("Rooms").First();

// Grab rooms 2 & 3 for removal
var roomsToRemove = house.Rooms.OrderBy(r => r.Id).Skip(1).Take(2).ToList();
roomsToRemove.ForEach(r => db.Rooms.Remove(r));

db.SaveChanges();
于 2016-06-23T18:48:14.103 に答える