ASP.NET 2 внешних ключа из одной таблицы [дубликат]

Js - однопоточная.

blockquote>

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

219
задан SB2055 15 June 2013 в 20:52
поделиться

13 ответов

Поскольку Stage является обязательным , все отношения «один ко многим», в которых задействован Stage, будут иметь каскадное удаление по умолчанию. Это означает, что если вы удалите объект Stage

  • , удаление будет каскадом непосредственно на Side
  • , удаление будет каскадом непосредственно на Card и потому что Card и Side имеют обязательные отношения один-ко-многим с каскадным удалением, включенным по умолчанию, затем он будет каскадом от Card до Side

Итак, у вас есть два каскадных удалить пути из Stage в Side - что вызывает исключение.

Вы должны либо сделать Stage необязательным, по крайней мере, в одном из объектов (т. е. удалить атрибут [Required] из Stage) или отключить каскадное удаление с помощью Fluent API (невозможно с аннотациями данных):

modelBuilder.Entity<Card>()
    .HasRequired(c => c.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Side>()
    .HasRequired(s => s.Stage)
    .WithMany()
    .WillCascadeOnDelete(false);
302
ответ дан Riz 28 August 2018 в 18:37
поделиться

Ни один из вышеупомянутых решений не работал для меня. Мне нужно было использовать nullable int (int?) Для внешнего ключа, который не был необходим (или не был не нулевым столбцом), а затем удалить некоторые из моих миграций.

Начните с удаления миграции, затем попробуйте ввести значение null.

Проблема была как модификацией, так и моделью. Не требуется изменение кода.

0
ответ дан Ayson Baxter 28 August 2018 в 18:37
поделиться

У меня была таблица с круговыми отношениями с другими, и я получал ту же ошибку. Оказывается, это касается внешнего ключа, который не может быть недействительным. Если ключ не является нулевым, связанный объект должен быть удален, а круговые отношения не позволяют этого. Поэтому используйте нулевой внешний ключ.

[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int? StageId { get; set; }
36
ответ дан Cem Mutlu 28 August 2018 в 18:37
поделиться

Существующие ответы велики, я просто хотел добавить, что я столкнулся с этой ошибкой по другой причине. Я хотел создать начальную миграцию EF в существующей БД, но я не использовал флаг -IgnoreChanges и применил команду Update-Database в пустой базе данных (также при существующих сбоях).

Вместо этого я должен был выполнить эту команду, когда текущая структура db является текущей:

Add-Migration Initial -IgnoreChanges

В структуре db существует реальная проблема, но сохранить мир за один шаг за раз ...

1
ответ дан CodingYourLife 28 August 2018 в 18:37
поделиться

У меня тоже была эта проблема, я сразу же решил ее с помощью этого ответа из аналогичного потока

. В моем случае я не хотел удалять зависимую запись по ключу удаление. Если это имеет место в вашей ситуации, просто просто измените значение Boolean при переходе на false:

AddForeignKey("dbo.Stories", "StatusId", "dbo.Status", "StatusID", cascadeDelete: false);

Скорее всего, если вы создаете отношения, которые генерируют эту ошибку компилятора, но DO хотят сохранить каскадное удаление ; у вас есть проблема с вашими отношениями.

5
ответ дан Hakam Fostok 28 August 2018 в 18:37
поделиться

Просто для целей документации, для того, кто приходит в будущее, эта вещь может быть решена так просто, как это, и с помощью этого метода вы можете сделать способ, который отключен один раз, и вы могли бы нормально обращаться к вашему методу

Добавьте этот метод в класс базы данных контекста:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
1
ответ дан john 28 August 2018 в 18:37
поделиться

Это звучит странно, и я не знаю почему, но в моем случае это происходило, потому что мой ConnectionString использовал «.». в атрибуте «источник данных». Как только я изменил его на «localhost», он работал как шарм. Никаких других изменений не было.

1
ответ дан Marco Alves 28 August 2018 в 18:37
поделиться

В .NET Core я изменил параметр onDelete на ReferencialAction.NoAction

         constraints: table =>
            {
                table.PrimaryKey("PK_Schedule", x => x.Id);
                table.ForeignKey(
                    name: "FK_Schedule_Teams_HomeId",
                    column: x => x.HomeId,
                    principalTable: "Teams",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.NoAction);
                table.ForeignKey(
                    name: "FK_Schedule_Teams_VisitorId",
                    column: x => x.VisitorId,
                    principalTable: "Teams",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.NoAction);
            });
1
ответ дан Mike Jones 28 August 2018 в 18:37
поделиться

Вы можете установить cascadeDelete в false или true (в методе миграции Up ()). Зависит от вашего требования.

AddForeignKey("dbo.Stories", "StatusId", "dbo.Status", "StatusID", cascadeDelete: false);
14
ответ дан Nazim Turakulov 28 August 2018 в 18:37
поделиться

Кто-нибудь задается вопросом, как это сделать в ядре EF:

      protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
                {
                    relationship.DeleteBehavior = DeleteBehavior.Restrict;
                }
           ..... rest of the code.....
19
ответ дан Nexus23 28 August 2018 в 18:37
поделиться

В .NET Core я играл со всеми верхними ответами - но без каких-либо успехов. Я много изменил структуру БД и каждый раз добавлял новую попытку миграции в update-database, но получал ту же ошибку.

Затем я начал remove-migration один за другим, пока Консоль диспетчера пакетов бросил мне исключение:

Миграция '20170827183131 _ ***' уже была применена к базе данных

. После этого я добавил новую (add-migration) и update-database успешно

Таким образом, мое предложение было бы: очистить все ваши временные миграции до вашего текущего состояния БД.

0
ответ дан rock_walker 28 August 2018 в 18:37
поделиться

Я получал эту ошибку для многих объектов, когда я переносился с модели EF7 на версию EF6. Я не хотел проходить каждую сущность по одному, поэтому я использовал:

builder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
builder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
19
ответ дан Sean 28 August 2018 в 18:37
поделиться

Я исправил это. Когда вы добавите миграцию, в методе Up () появится строка, подобная этой:

.ForeignKey («dbo.Members», t => t.MemberId, cascadeDelete: True)

Если вы просто удалите cascadeDelete с конца, он будет работать.

1
ответ дан Usman Khan 28 August 2018 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: