0

次のようなTPHルックアップテーブルを使用してコードファーストモデルを設計しようとしています。

public abstract class LookupValue
{
   [Key]
   public string Value { get; set; }
}

public class PaymentTerm : LookupValue {}
public class ShippingCode : LookupValue {}
public class ReviewStatus : LookupValue {}
public class RecordStatus : LookupValue {}

Entity Frameworkで、次のように識別子を使用してテーブルを生成する必要があります。

CREATE TABLE [LookupValues] (
    [Value] [nvarchar](30) NOT NULL,
    [Discriminator] [nvarchar](128) NOT NULL,
    CONSTRAINT [PK_dbo.LookupValues] PRIMARY KEY ([Value])
)

私のコンテキストOnModelCreatingオーバーライドでは、次のように定義しました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<PaymentTerm>()
                .Map(m => m.Requires("Discriminator").HasValue("PaymentTerm"));
    modelBuilder.Entity<ShippingCode>()
                .Map(m => m.Requires("Discriminator").HasValue("ShippingCode"));
    modelBuilder.Entity<ReviewStatus>()
                .Map(m => m.Requires("Discriminator").HasValue("ReviewStatus"));
    modelBuilder.Entity<RecordStatus>()
                .Map(m => m.Requires("Discriminator").HasValue("RecordStatus"));
}

これらのルックアップオブジェクトを次のように使用したいと思います。

public class Customer {
     ....
     [Required]
     public virtual PaymentTerm Terms { get; set; }

     [Required]
     public virtaul ShippingCode ShippingCode { get; set; }

     [Required]
     public virtual ReviewStatus ReviewStatus { get; set; }

     [Required]
     public virtual RecordStatus RecordStatus { get; set; }
     ...
}

コードファーストマイグレーションを作成できますが、データベースを更新しようとするとエラーが発生します

参照関係は、許可されていない循環参照になります。

これはON DELETE CASCADE、SQLスクリプトが次のように生成するためであることがわかりました。

ALTER TABLE [Customer] ADD CONSTRAINT [FK_dbo.Customer_dbo.LookupValues_ShippingCode_Value] FOREIGN KEY ([ShippingCode_Value]) REFERENCES [LookupValues] ([Value]) ON DELETE CASCADE
ALTER TABLE [Customer] ADD CONSTRAINT [FK_dbo.Customer_dbo.LookupValues_PaymentTerms_Value] FOREIGN KEY ([PaymentTerms_Value]) REFERENCES [LookupValues] ([Value]) ON DELETE CASCADE
ALTER TABLE [CustomerClinicDoctors] ADD CONSTRAINT [FK_dbo.Customer_dbo.LookupValues_RecordStatus_Value] FOREIGN KEY ([RecordStatus_Value]) REFERENCES [LookupValues] ([Value]) ON DELETE CASCADE
ALTER TABLE [Customer] ADD CONSTRAINT [FK_dbo.Customer_dbo.LookupValues_ReviewStatus_Value] FOREIGN KEY ([ReviewStatus_Value]) REFERENCES [LookupValues] ([Value]) ON DELETE CASCADE

流暢なAPIに入れる必要があることを読みましたが.WillCascadeOnDelete(false)、それを受け入れることができません。助けを期待して...

これらの関係でDELETECASCADEをオフにするにはどうすればよいですか。ルックアップ値を削除する機能は本当に必要ではありませんが、リポジトリに単純なコードインターフェイスが必要でした。

4

1 に答える 1

1

すべての関係に対して流暢なマッピングを定義する必要があります。これを試して:

public class YourContext : DbContext {
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.Terms)
                    .WithMany()
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.ShippingCode)
                    .WithMany()
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.ReviewStatus)
                    .WithMany()
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Customer>()
                    .HasRequired(c => c.RecordStatus)
                    .WithMany()
                    .WillCascadeOnDelete(false);
    }
}
于 2013-02-19T09:16:08.347 に答える