Я пытаюсь разработать модель с первым кодом с таблицей поиска 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; }
...
}
Я могу создать Code-First Migration, но когда я пытаюсь обновить базу данных, я получаю сообщение об ошибке
Ссылочная связь приведет к циклической ссылке, которая не разрешена...
Я понял, что это связано с ON DELETE CASCADE
, который SQL Script генерирует следующим образом:
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
Я читал, что я должен поместить .WillCascadeOnDelete(false)
в свободный API, но я не могу заставить его принять его. Надеюсь на помощь...
Как я могу отключить DELETE CASCADE для этих отношений. Я не собираюсь действительно нуждаться в возможности удалять значения поиска, но мне просто нужен простой интерфейс кода в моем репозитории.