none
EntitiyFreamwork Cordfirstにて例外「パスの循環や複数のカスケード パスが生じる可能性があります」の対処方法を教えてください。 RRS feed

  • 質問

  • 環境VisualStudio2013----------------------

    使用言語   C#

    対象     .NET4.5

    使用ライブラリ EntitiyFreamwork Cordfirst

    使用DB    SqlServer2014 

    --------------------------------------------

    現在,上記環境にてデータベースを作成出来るようにプログラムを作成しているのですが

    下記、例外が発生し対応策を考えていますが、データーベースもプログラムも勉強不足で解決出来ていません。

    例外:【追加情報:テーブル 'FaoultLogs' に FOREIGN KEY 制約 'FK_dbo.FaoultLogs_dbo.Machines_MachineId' を設定すると、パスの循環や複数のカスケード パスが生じる可能性があります。ON DELETE NO ACTION、ON UPDATE NO ACTION、を指定するか、他の FOREIGN KEY 制約を変更してください。】

    考えているプログラムは、

    1、機械情報保持テーブル(Machines)

    2.機械の異常コード保持テーブル(FaoultCodes)

    3.異常履歴テーブル(FaoultLogs)

    が有り、各機械で異常が発生すると異常履歴テーブルに発生時間、終了時間を書き込む、と言うものです。

    調べていくと、FaoultCodesテーブルのMachineIdでリレーションがおかしく例外が発生しているのでは??

    (FaoultLogsテーブルにMachineIdがあり、さらにFaoultCodeIdがあるのでFaoultCodesテーブルでもMachineIdがある為??)

    というところまでは分かったのですが、対策がわかりません。

    テーブル設計を見直したほうが良いのか?それとも、プログラムや設定で回避できることなのか?

    等々、教えていただけると助かります。

    以上、よろしくお願いします。

    ■コード

    using System.Data.Entity;
    using System.ComponentModel.DataAnnotations;

    static void Main(string[] args) { using(HogeContext con = new HogeContext()) { Machine m1 = new Machine { Name = "1号" }; Machine m2 = new Machine { Name = "2号" }; FaoultCode m1No1 = new FaoultCode {              machine = m1,              Number = 1,              FaoultContent = "異常1_..." }; FaoultCode m1No2 = new FaoultCode {              machine = m1,              Number = 2,              FaoultContent = "異常2_..." }; FaoultCode m1No3 = new FaoultCode {              machine = m1,              Number = 3,              FaoultContent = "異常3_..." }; FaoultCode m2No1 = new FaoultCode {              machine = m2,              Number = 1,              FaoultContent = "異常1_..." }; FaoultCode m2No2 = new FaoultCode {              machine = m2,              Number = 2,              FaoultContent = "異常2_..." }; FaoultCode m2No3 = new FaoultCode {              machine = m2,              Number = 3,              FaoultContent = "異常3_..." }; con.FaoultLogs.Add(new FaoultLog {        machine = m1,        StartTime = DateTime.Now,        EndTime = DateTime.Now + new TimeSpan(100),

           faoultCode=m1No1}); } Console.WriteLine("END"); Console.ReadKey(); } } class FaoultLog { public long FaoultLogId { get; set; } public int MachineId { get; set; } public virtual Machine machine { get; set; } public DateTime StartTime { get; set; } public DateTime EndTime { get; set; } public int FaoultCodeId { get; set; } public virtual FaoultCode faoultCode { get; set; } } class FaoultCode { public int FaoultCodeId { get; set; } public int MachineId { get; set; } public virtual Machine machine { get; set; } public int Number { get; set; } [MaxLength(30)] public string FaoultContent { get; set; } } class Machine { public int MachineId { get; set; } [Required] [MaxLength(10)] public string Name { get; set; } public virtual ICollection<FaoultCode> faoultCodes { get; set; } public virtual ICollection<FaoultLog> faoultLogs { get; set; } } class HogeContext : DbContext { public HogeContext() : base("HogeContextDB") { } public DbSet<Machine> Machines { get; set; } public DbSet<FaoultCode> FaoultCodes { get; set; } public DbSet<FaoultLog> FaoultLogs { get; set; } }

    ■↓データベースの構成は、このような物を考えています。

    Table名 FaoultLogs 型                
    PK LogId bigint
    FK MachineId int
    StartTime datetime
    EndTime datetime
    FK FaultCodeId int

    Table名 Machines
    PK MachineId
    Name

    Table名 FaoultCodes
    PK FaoultCodeId int
    FK MachineId bigint
    FaoultContent nchar(30)

    2014年7月4日 14:37

回答

  • protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder
                    .Entity<Machine>()
                    .HasMany<FaoultCode>(x => x.FaoultCodes)
                    .WithRequired(x => x.Machine).WillCascadeOnDelete(false);
                base.OnModelCreating(modelBuilder);
            }
    Context内に上記コードを入れて良くなりました!
    2014年7月12日 2:54