Внешний ключ между двумя объектами - Внутренняя ошибка исключения - PullRequest
0 голосов
/ 01 февраля 2012

Я работаю над приложением 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);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...