私のコードファーストデータベースはうまく機能していました。データベースコンテキストに変更を加えた場合、次にアプリケーションを起動したときにデータベースが更新されます。しかし、その後、データベースにいくつかのモデルを追加し、アプリケーションを再起動したときにこのエラーが発生しました。
Introducing FOREIGN KEY constraint 'FK_OrderDetails_Orders_OrderId' on table 'OrderDetails' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.
奇妙なことの1つは、何も変更せずにアプリケーションを再起動すると、次のエラーが発生することです。
Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.
最初のエラーが再び発生するようにするには、.mdfファイルと.ldfファイル(データベース)を削除し、.mdfファイルだけをリビジョン履歴からのコピーに置き換える必要があります。
なぜ世界でこれが起こっているのですか?
参考のために:
私のGlobal.asax.csファイルには、Application_Start()
メソッド内に次のものがあります。
Database.SetInitializer<EfDbContext>(new EfDbContextInitializer());
これは次のようになります:
public class EfDbContextInitializer : DropCreateDatabaseIfModelChanges<EfDbContext>
{
protected override void Seed(EfDbContext context)
{
var orders = new List<Order>
{
. . .
};
orders.ForEach(s => context.Orders.Add(s));
. . . etc. . .
context.SaveChanges();
}
}
からの私の接続文字列Web.config
:
<add name="EFDbContext" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;database=pos;AttachDBFilename=|DataDirectory|pos.mdf;MultipleActiveResultSets=true;User Instance=true" providerName="System.Data.SqlClient" />
そして最後に、私のOrderモデルとOrderDetailsモデル(最初のエラーが直接参照しているもの):
public class Order
{
public int OrderId { get; set; }
public List<OrderDetail> OrderDetails { get; set; }
public int EstablishmentId { get; set; }
public virtual Establishment Establishment { get; set; }
}
public class OrderDetail
{
public int OrderDetailId { get; set; }
public int OrderId { get; set; }
public int ProductId { get; set; }
public int Quantity { get; set; }
public decimal UnitPrice { get; set; }
public virtual Product Product { get; set; }
public virtual Order Order { get; set; }
}
public int OrderId { get; set; }
更新/注: OrderDetailクラスでコメントアウトすると、プロジェクトは正常に起動します(ただし、 OrderId
(もちろん)を追加するための必要な機能は得られません。