2013-02-19 84 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); 
    } 
}