0

OneToMany 関係を削除せずに削除コレクションをカスケードするように EF に指示するにはどうすればよいですか?

すなわち:

public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int ClientId { get; set; }
    [ForeignKey("ClientId")]
    public Client Client { get; set; }
    public ICollection<OrderItem> OrderItems { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    [ForeignKey("OrderId")]
    public Order Order { get; set; }
}

このモデルでは、一部の注文に関連付けられたクライアントを削除しようとすると、削除を回避したいと考えています (1)。ただし、いくつかの OrderItems で Order を削除しようとすると、Order と関連する OrderItems (2) を削除したいと思います。

また、FK 列には 1 つの制限があります。EF の既定の [Model]_Id 形式ではなく、[Model]Id 形式です。

私が定義する場合

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

(1) は問題なく動作しますが、(2) エラーが発生します。

各コレクションに Fluent を使用する以外に代替手段はありますか? とにかくFluentでこれを行うにはどうすればよいですか?

4

1 に答える 1

2

どちらの場合も、1 対多の関係です。カスケード削除規則を削除することで、どちらのケースもカスケード削除なしで処理する必要があることを EF に伝えます。

リレーションごとにカスケード削除を制御する場合は、流暢な API を使用する必要があります。

modelBuilder.Entity<Order>()
            .HasMany(o => o.OrderItems)
            .WithRequired(i => i.Order)
            .HasForeignKey(i => i.OrderId)
            .WillCascadeOnDelete(true);

modelBuilder.Entity<OrderItem>()
            .Property(i => i.OrderId)
            .HasColumnName("OrderId");

また、規則を使用 (または削除) して、動作を変更したい場合にリレーションのみに流暢な API を使用することもできます。

OrderId プロパティを使用したくない場合は、次を使用できます。

modelBuilder.Entity<Order>()
            .HasMany(o => o.OrderItems)
            .WithRequired(i => i.Order)
            .Map(m => m.MapKey("OrderId"))
            .WillCascadeOnDelete(true);

これら 2 つのオプションはEF での実装が異なることに注意してください。

于 2013-04-16T18:28:03.467 に答える