1

У меня есть следующая датамодель и связанные с ней классы моделей. Я делаю удаление зависимостей, чтобы все было правильно, но я продолжаю получать эту ошибку.Циклы или несколько каскадных путей

DataModel

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

Теперь моя ошибка между таблицами опций и Техническиехарактеристики. У меня была ошибка с параметрами LSystem и SetVal &.

Каким может быть обходной путь для правильной работы? Я не пробовал свободно API.

+0

imho, 'public virtual Technicalharacteristic TechnicalCharacteristic {get; задавать; } 'класса Option достаточно, чтобы установить цикл. Комментирование 'public virtual ICollection

+0

Вы читали http://stackoverflow.com/questions/29062094/entity-framework-code-first-cycles-or-multiple-cascade-paths – tschmit007

+0

@ tschmit007: Если вы не возражаете, можете ли вы рассказать мне, почему «public virtual TechnicalCharacteristic Технические характеристики {get; задавать; } 'устанавливает цикл? – Vini

ответ

1

Вот еще один способ, которым вы можете сделать то же самое И иметь требуемый технический харизм. Я сделал это на прошлой неделе с одной из моих собственных моделей. Извините, что так долго приходилось придумывать ответ. (Сделайте то же самое с другими файлами.)

В файле контекста переопределить следующий метод ...

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

} 

Я надеюсь, что это помогает ,

+0

Спасибо за комментарий. Я удалил каскадные удаления в целом, и ни одна из моих функций Delete не работала. Поэтому я закодировал удаление дочерних классов в родительском классе, и теперь он отлично работает. Но я думаю, что ваш ответ - это то, что я искал. – Vini

0

Я считаю, что ваша ошибка возникает, потому что EntityFramework не может обрабатывать нулевое состояние вашего TechnicalCharacteristicID в классе Option. Если у вас нет проблемы с параметром 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; } 
} 

Сделайте то же самое с другими странствующими таблицами. Надеюсь, это ответит на ваш вопрос! Удачи.

+0

Нет, это исключение SQL Server (и ограничение). Дело не в том, что EF не может справиться. –

+0

@alikuli: но я не могу сделать технические характеристики недействительными. он может песка как самостоятельная сущность. но вариант не требуется для конкретной технической характеристики. но я полагаю, что сделал это именно так. – Vini

+0

Если у вас есть опция без технической характеристики ..., то вы можете использовать ее. Если вам нужна техническая характеристика, которая требуется, вы можете сделать это с помощью кода, то есть убедиться, что он присутствует. – alikuli