Я работаю над приложением ASP.NET MVC3 с использованием Entity Framework 4.1
Моя проблема заключается в попытке создать связь между двумя объектами, чтобы позволить мне использовать значения в раскрывающемся меню.Когда я использую следующий код, я получаю Внутреннюю ошибку исключения
InnerException {"Introducing FOREIGN KEY constraint 'TrafficCop_PLCModule' on table 'TrafficCops' may cause cycles or multiple cascade paths.
У меня есть две сущности, PLCModules и TrafficCop
В TrafficCop, я пытаюсь создать выпадающее меню значений изстолбец Имя PLCModule.
Вот мой объект PLCModule
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace EDWv2.Models
{
public class PLCModule
{
public int PLCModuleID { get; set; }
public string Name { get; set; }
public int PLCModuleControlProcessorMfgID { get; set; }
public int PLCModuleDescID { get; set; }
public int PLCModuleRemarksID { get; set; }
public virtual PLCModuleControlProcessorMfg PLCModuleControlProcessorMfg { get; set; }
public virtual PLCModuleDesc PLCModuleDesc { get; set; }
public virtual PLCModuleRemarks PLCModuleRemarks { get; set; }
public virtual ICollection<TrafficCop> TrafficCop { get; set; }
}
}
Вот мой объект TrafficCop
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace EDWv2.Models
{
public class TrafficCop
{
public int TrafficCopID { get; set; }
public string DropRack { get; set; }
public string Slot { get; set; }
public string AddressStart { get; set; }
public string AddressEnd { get; set; }
public string Drawing { get; set; }
public int ControlSystemDesignationID { get; set; }
public int PLCModuleDescID { get; set; }
public int PLCModuleID { get; set; }
public virtual PLCModule PLCModule { get; set; }
public virtual PLCModuleDesc PLCModuleDesc { get; set; }
public virtual ControlSystemDesignation ControlSystemDesignation { get; set; }
}
}
Вот мой файл DbContext
public class EDWContext : DbContext
{
public DbSet<EDWSystem> EDWSystem { get; set; }
public DbSet<ControlSystemDescription> ControlSystemDescription { get; set; }
public DbSet<ControlSystemDesignation> ControlSystemDesignation { get; set; }
public DbSet<ControlProcessorMfg> ControlProcessorMfg { get; set; }
public DbSet<ControlProcessorModel> ControlProcessorModel { get; set; }
public DbSet<ControlProcessorProgram> ControlProcessorProgram { get; set; }
public DbSet<PLCModule> PLCModule { get; set; }
public DbSet<PLCModuleControlProcessorMfg> PLCModuleControlProcessorMfg { get; set; }
public DbSet<PLCModuleDesc> PLCModuleDesc { get; set; }
public DbSet<PLCModuleRemarks> PLCModuleRemarks { get; set; }
public DbSet<PlantLayout> PlantLayout { get; set; }
public DbSet<PlantLayoutBuildingDesig> PlantLayoutBuildingDesig { get; set; }
public DbSet<PlantLayoutBuildingFloor> PlantLayoutBuildingFloor { get; set; }
public DbSet<PlantLayoutBuildingUse> PlantLayoutBuildingUse { get; set; }
public DbSet<PlantLayoutFireProtection> PlantLayoutFireProtection { get; set; }
public DbSet<PlantLayoutFireSystem> PlantLayoutFireSystem { get; set; }
public DbSet<PlantLayoutFireMonitorCH> PlantLayoutFireMonitorCH { get; set; }
public DbSet<TrafficCop> TrafficCop { get; set; }
public DbSet<Abbreviation> Abbreviation { get; set; }
public DbSet<PreferredFieldDevice> PreferredFieldDevice { get; set; }
public DbSet<SupplyVoltage> SupplyVoltage { get; set; }
public DbSet<ControlVoltage> ControlVoltage { get; set; }
public DbSet<SignalVoltage> SignalVoltage { get; set; }
public DbSet<Communication1> Communication1 { get; set; }
public DbSet<Communication2> Communication2 { get; set; }
public DbSet<Communication3> Communication3 { get; set; }
}
Спасибо,
Джейсон
Редактировать:
Используя Fluent API, я могу использовать что-то вроде этого, но я не думаю, что это правильный путь,
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
это мое окончательное решение
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<TrafficCop>()
.HasOptional(p => p.PLCModules)
.WithMany()
.HasForeignKey(p => p.PLCModuleID)
.WillCascadeOnDelete(false);
}