设置EF5和查找表时出现问题

时间:2013-02-19 00:48:10

标签: entity-framework-5 table-per-hierarchy

我正在尝试使用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; }
     ...
}

我可以创建代码优先迁移,但是当我尝试更新数据库时,出现错误

引用关系将导致不允许循环引用...

我已经发现这是由于SQL Script生成的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。我不打算真的需要删除查找值的能力,但只是想在我的存储库中使用一个简单的代码接口。

1 个答案:

答案 0 :(得分: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);
    }
}