0

Initializer を使用して DB を設定しようとすると、いくつかの問題が発生します。LabTest->LabValue<-LabIndicator という 3 つのテーブルがあり、次のようにコーディングします。

public class LabTest
    {
        public int ID { get; set; }
        public DateTime ApplicationDate { get; set; }
        public virtual ICollection<LabValue> LabValues { get; set; }
    }

public class LabValue
    {
        public int ID { get; set; }
        public decimal Value { get; set; }
        public int LabTestID { get; set; }
        public int LabIndicatorID { get; set; }
        public virtual LabTest LabTest { get; set; }
        public virtual LabIndicator LabIndicator { get; set; }
    }

  public class LabIndicator
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public virtual ICollection<LabValue> LabValues { get; set; }
    }

これは、DBContext で Db Intializer をコーディングする方法です。

public class SummumnetDB : DbContext
{
  public DbSet<LabIndicator> LabIndicators { get; set; }
  public DbSet<LabTest> LabTests { get; set; }
  public DbSet<LabValue> LabValues { get; set; }

  public class MyFirstInitializer : DropCreateDatabaseIfModelChanges<SummumnetDB> 
  { 
     protected override void  Seed(SummumnetDB context)
     {
          new List<LabTest>
          {
               new LabTest{ ApplicationDate = DateTime.Now},
               new LabTest{ ApplicationDate = DateTime.Now},
          }.ForEach(l => context.LabTest.Add(l));

           new List<LabIndicator>
           {
                new LabIndicator{ Name="CHOLESTEROL", Description = "Cholesterol lvl"},
                new LabIndicator{ Name="HEMOGLOBIN", Description = "Hemoglobin lvl"},
                new LabIndicator{ Name="GLUCOSE", Description = "Glucose lvl"},
           }.ForEach(l => context.LabIndicators.Add(l));

           new List<LabValue>
           {
                new LabValue{ LabTestID = 1, LabIndicatorID = 1, Value = 2.3m },
                new LabValue{ LabTestID = 1, LabIndicatorID = 2, Value = 5.8m },
                new LabValue{ LabTestID = 1, LabIndicatorID = 3, Value = 5.2m },
                new LabValue{ LabTestID = 2, LabIndicatorID = 1, Value = 6.7m },
                new LabValue{ LabTestID = 2, LabIndicatorID = 2, Value = 9.8m },
                new LabValue{ LabTestID = 2, LabIndicatorID = 3, Value = 4.3m },
           }.ForEach(l => context.LabValue.Add(l));

           base.Seed(context);
     }
}

問題は、それを実行すると、EF がデータベースを作成しようとすると、次のエラーが発生することです。

INSERT ステートメントが FOREIGN KEY 制約 "LabIndicator_LabValues" と競合しました。データベース「SummumnetDB」、テーブル「dbo.LabIndicators」、列「ID」で競合が発生しました。ステートメントは終了されました。解決できることを願っています、ありがとう。

4

2 に答える 2

0

モデル バインディングで何か問題が発生しているようです。モデルバインダーを提供していただけますか?持っていない場合は、作成してみてください。さらに、insert ステートメントが実際に行っていることを intellitrace で確認できます。

于 2011-07-22T10:28:58.223 に答える
0

インサートの順番が間違っていませんか?

クラスLabIndicatorから、既存のLabValueレコードへの参照があることがわかります。

Seed最後の 2 つのクラスの順序を元に戻そうとしましたか?

から:

new LabTest
new LabIndicator
new LabValue

new LabTest
new LabValue
new LabIndicator
于 2012-02-17T09:33:58.370 に答える