c # EntityFramework версия 6.1.3 НЕ УДАЛИТЬ ПОДРОБНОСТИ - PullRequest
0 голосов
/ 25 февраля 2019

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

Операция не выполнена: отношение не может быть изменено, поскольку одно или несколько свойств внешнего ключа не являются-nullable.Когда в отношение вносится изменение, для соответствующего свойства внешнего ключа устанавливается нулевое значение.Если внешний ключ не поддерживает нулевые значения, необходимо определить новое отношение, свойству внешнего ключа должно быть назначено другое ненулевое значение или несвязанный объект должен быть удален.

CASEТЕСТ 1:

using (var context = new clsDB.Entities())
{
    var DELETETEST= (from o in context.Tab_Master.Include("Tab_Details") where o.IdMaster == 472 select o).FirstOrDefault();
    if (DELETETEST!= null)
    {
        var detail = DELETETEST.Tab_Details.First();
        DELETETEST.Tab_Details.Remove(detail);

        context.SaveChanges();
    }
}

СЛУЧАЙ ТЕСТ 2:

public class Docume : DbContext
{

    public Entities DocumeTest { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<Tab_Master>()
                    .HasKey(x => x.IdMaster);
        modelBuilder.Entity<Tab_Details>()
                    .HasKey(x => x.IdDetails);
        modelBuilder.Entity<Tab_Master>()
                    .HasMany(x => x.Tab_Details)
                    .WithRequired()
                    .HasForeignKey(x => x.IdTab_Master)
                    .WillCascadeOnDelete(false);

    }
}

Я проверил отношения END1 (каскад) и END2 (нет)

Я не знаю, что делатьделать.Вы можете мне помочь?

1 Ответ

0 голосов
/ 26 февраля 2019

Для Case1 вы просто удаляете отношение внешнего ключа и не удаляете Tab_Details из БД.Один из способов исправить это было бы использовать:

context.Tab_Detail.Remove(detail);

вместо:

DELETETEST.Tab_Details.Remove(detail);

Я не уверен, если это делает ваш Case2 неуместным, но сейчас я бы предложил простопереключение на одну строку.

Если это возможно, я бы просто получил Tab_Detail из БД, например, используя

var detail = (from d in context.Tab_Detail where d.IdTab_Master== 472 select o).FirstOrDefault();
if(detail != null)
{
    context.Tab_Detail.Remove(detail);
    context.SaveChanges();
}

, предполагая, что мастер имеет только одну деталь;в противном случае, если вы знаете IdDetails, просто используйте его для выбора.

РЕДАКТИРОВАТЬ: измените последнюю часть Case2 (OnModelCreating) на

modelBuilder.Entity<Tab_Master>()
            .HasMany(x => x.Tab_Details)
            .WithRequired(x => x.IdTab_Master)
            .WillCascadeOnDelete();

Каскадное удаление должно бытьустановить в true;Это означает, что если вы удалите Мастер, все детали должны быть удалены (в противном случае вы также получите ошибку, которую вы упомянули).Для дальнейшего ознакомления посмотрите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...