循环或多个级联路径

时间:2015-09-30 14:40:36

标签: c# entity-framework asp.net-mvc-5 foreign-keys cascading-deletes

我有以下数据模型及其关联的模型类。我一直在删除依赖项以使其正确,但我继续收到此错误。

数据模型

Class diagram

我无法找出模型中存在级联路径的原因。我恐怕无法减少依赖性。

模型类

public class DataFormat
{
    public int DataFormatID { get; set; }
    [Display (Name = "Data Format Name")]
    [Remote("DuplicateFormatName", "DataFormats", HttpMethod = "POST", ErrorMessage = "Data Format Name already Exists")]
    public string FormatName { get; set; }
    [Display (Name = "Data Format Type")]
    public string FormatType { get; set; }
    [Display (Name = "Precision Digits")]
    public string PrecisionDigits { get; set; }
    [Display (Name = "Scaling Digits")]
    public string ScalingDigits { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    [Display (Name = "Description in English")]
    public string DescriptionEN { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set;}
    public string ModifiedBy { get; set; }

    public virtual ICollection<TcSet> TcSets { get; set; }
}

public class Lsystem
{
    public int LsystemID { get; set; }
    [Display (Name = "System Name") ]
    [Remote("DuplicateSystemName", "Lsystems", HttpMethod = "POST", ErrorMessage = "System Name already Exists")]
    public string LsystemName { get; set; }
    [Display (Name = "Material Number")]
    public string MaterialNumber { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }
    [Display(Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }

    public int LsystemFamilyID { get; set; }

    public virtual LsystemFamily LsystemFamily { get; set; }
    public virtual ICollection<Option> Options { get; set; }
}

public class LsystemFamily
{
    public int LsystemFamilyID { get; set; }
    [Display (Name = "Family Name")]
    [Remote("DuplicateFamilyName","LsystemFamilies",HttpMethod = "POST",ErrorMessage= "System Family Name already Exists")]
    public string FamilyName { get; set; }
    public int LsystemCount { get; set; }
    [Display ( Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public virtual ICollection<Lsystem> Lsystems { get; set; }
}

public class Option
{
    public int OptionID { get; set;}
    [Display (Name = "Option Type")]
    public string OptionName { get; set; }
    [Display (Name ="Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int TechnicalCharacteristicID { get; set; }
    public int LsystemID { get; set; }

    public virtual ICollection<OptionValue> OptionValues { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Lsystem Lsystem { get; set; }
   // public virtual ICollection< SetValue> SetValue { get; set; }
}

public class OptionValue
{
    public int OptionValueID { get; set; }
    [Display(Name = "Option Value")]
    public string OptionVal { get; set; }

    public int OptionID { get; set; }
   // public int SetValueID { get; set; }

    public virtual Option Option { get; set; }
    public virtual ICollection< SetValue> SetValue { get; set; }
}

public class SetValue
{
    public int SetValueID { get; set; }
    [Display(Name = "Value")]
    public string Value { get; set; }
    [Display(Name="Internal")]
    public bool Status { get; set; }

    //public int LsystemID { get; set; }
    //public int OptionID { get; set; }
    public int TcSetID { get; set; }
    public int OptionValueID { get; set; }

    //public virtual Lsystem Lsystem { get; set; }
    //public virtual Option Option { get; set; }
    public virtual OptionValue OptionValue { get; set; }
    public virtual TcSet TcSet { get; set; }

}

public class TcSet
{
    public int TcSetID { get; set; }
    [Display (Name = "Technical characteristic Property name")]
    public string SetName { get; set; }
    [Display(Name = "PhysicalUnit")]
    public string PhysicalUnit { get; set; }
    [Display (Name = "Data Usage")]
    public DataUsage DataUsage { get; set; }
    [Display (Name = "Data Status")]
    public DataStatus DataStatus { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    [Display (Name = "Description in English")]
    public string DescriptionEN { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int TechnicalCharacteristicID { get; set; }
    public int DataFormatID { get; set; }

    public virtual ICollection<SetValue> SetValues { get; set; }
    public virtual DataFormat DataFormat { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
}

public class TechnicalCharacteristic
{
    public int TechnicalCharacteristicID { get; set; }
    [Display (Name = "Technical Characteristic Name")]
    public string TCName { get; set; }
    [Display (Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display (Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public virtual ICollection<TcSet> TcSets { get; set; }
    //public virtual ICollection<Option> Options { get; set; }
}

现在我的错误是表格Options和technicalCharacteristics之间。我对LSystem和SetVal&amp; amp;选项。

让任务正确的解决方法是什么? 我没有尝试过流利的API。

2 个答案:

答案 0 :(得分:1)

这是另一种方法,你可以做同样的事情并且需要一个techChareristic。我上周用我自己的模特做了这个。很抱歉,这么长时间才能得到回复。 (对其他文件也一样。)

在您的Context文件中覆盖以下方法...

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Option>()
            .HasRequired(x => x.TechnicalCharacteristic)
            .WithMany(y => y.Options)
            .HasForeignKey(a => a.TechnicalCharacteristicID)
            .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

模型在哪里......

public class Option
{
    public int OptionID { get; set; }
    [Display(Name = "Option Type")]
    public string OptionName { get; set; }
    [Display(Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int LsystemID { get; set; }

    public virtual ICollection<OptionValue> OptionValues { get; set; }

    public int TechnicalCharacteristicID { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Lsystem Lsystem { get; set; }
    // public virtual ICollection< SetValue> SetValue { get; set; }

    DateTime d = new DateTime();
}


public class TechnicalCharacteristic
{
    public int TechnicalCharacteristicID { get; set; }
    [Display(Name = "Technical Characteristic Name")]
    public string TCName { get; set; }
    [Display(Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public virtual ICollection<TcSet> TcSets { get; set; }
    public virtual ICollection<Option> Options { get; set; }

}

我希望这会有所帮助。

答案 1 :(得分:0)

我相信您的错误即将发生,因为EntityFramework无法处理Option类中的TechnicalCharacteristicID的null状态。如果您在TechnicalCharacteristic中没有问题,请在选项类中执行以下操作。它应该摆脱你的错误:

        public int? TechnicalCharacteristicID { get; set; }

也就是说,您的选项类将成为......

public class Option
{
    public int OptionID { get; set; }
    [Display(Name = "Option Type")]
    public string OptionName { get; set; }
    [Display(Name = "Description in English")]
    public string DescriptionEN { get; set; }
    [Display(Name = "Description in German")]
    public string DescriptionDE { get; set; }
    public DateTime CreatedOn { get; set; }
    public DateTime ModifiedOn { get; set; }
    public string CreatedBy { get; set; }
    public string ModifiedBy { get; set; }

    public int LsystemID { get; set; }

    public virtual ICollection<OptionValue> OptionValues { get; set; }

    public int? TechnicalCharacteristicID { get; set; }
    public virtual TechnicalCharacteristic TechnicalCharacteristic { get; set; }
    public virtual Lsystem Lsystem { get; set; }
    // public virtual ICollection< SetValue> SetValue { get; set; }
}

对其他错误表执行相同操作。我希望这回答了你的问题!祝你好运。