我的代码优先数据库运行良好。如果我对我的数据库上下文进行了更改,那么下次我启动应用程序时数据库将被更新。但是后来我在数据库中添加了一些模型,当我重新启动我的应用程序时出现了这个错误:
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.
奇怪的事情之一是,如果我在不更改任何内容的情况下再次启动应用程序,则会收到以下错误:
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; }
}
更新/注意:如果我在 OrderDetail 类中注释掉public int OrderId { get; set; }
,项目启动正常(尽管我没有获得所需的添加OrderId
(当然)的能力。