Wprowadzenie ograniczenia FOREIGN KEY w tabeli może spowodować, że cykle lub wiele ścieżek kaskadowych spowoduje, że Database.SetInitializer nie będzie działał?

Moja pierwsza baza danych kodu działała świetnie. Gdybym dokonał zmiany w moim kontekście bazy danych, baza danych byłaby aktualizowana przy następnym uruchomieniu aplikacji. Ale potem dodałem kilka modeli do bazy danych i otrzymałem ten błąd, gdy ponownie uruchomiłem aplikację:

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.

Jedną z dziwnych rzeczy jest to, że jeśli ponownie uruchomię aplikację bez zmiany czegokolwiek, otrzymam ten błąd:

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.

Aby powtórzyć pierwszy błąd, muszę usunąć moje pliki .mdf i .ldf (baza danych) i zastąpić tylko plik .mdf kopią z mojej historii wersji.

Dlaczego tak się dzieje na świecie?

Na przykład:

Mój plik Global.asax.cs ma to w plikuApplication_Start() metoda:

Database.SetInitializer<EfDbContext>(new EfDbContextInitializer());

Który wygląda tak:

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();
    }
}

Mój ciąg połączenia zWeb.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" />

I wreszcie, moje modele Order i OrderDetails (co odnosi się bezpośrednio do pierwszego błędu):

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; }
}

Aktualizacja / Uwaga: jeśli komentujępublic int OrderId { get; set; } w mojej klasie OrderDetail projekt uruchamia się dobrze (chociaż nie otrzymuję pożądanej zdolności dodawaniaOrderId (oczywiście).

questionAnswers(2)

yourAnswerToTheQuestion