2013-02-19 83 views
0

我試圖設計一個代碼優先模型與TPH查找表如下所示:問題建立EF5和查找表

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 {} 

我想實體框架生成與鑑別表,它的作用如下:

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; } 
    ... 
} 

我可以創建代碼優先遷移,但是當我嘗試更新數據庫時,出現錯誤

的引用關係將導致不允許週期性參考...

我已經想通了,這是由於SQL腳本生成如下ON DELETE CASCADE

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。我並不打算真的需要刪除查找值的功能,而只是想在我的Repository中使用一個簡單的代碼接口。

回答

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); 
    } 
}