2015-11-13 3 views
3

У меня есть базы данных SQL Server с 2 таблицы:asp.NET LINQ Удалить из базы данных

t1 - Категория

Id 
Name 

T2- Продукт

Id 
Name 
CategoryId 

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

Так что я сделал это:

var ProdCatID = (from prod in DataContext.Products 
       where prod.CategoryId == Convert.ToInt32(Id) 
       select prod).First(); 

ProdCatID.CategoryId = null; 
DataContext.SubmitChanges(); 

var DelCat = (from cat in DataContext.Categories 
      where cat.Id == Convert.ToInt32(Id) 
      select cat).ToList(); 

DataContext.Categories.DeleteAllOnSubmit(DelCat); 
DataContext.SubmitChanges(); 

То, что я m trying to do is to check if there is any product with that CategoryId , if there is - I want to set the CategoryID to null and then delete the row from the category` стол.

Он работает, когда у меня есть продукт с CategoryId, но когда я не могу его удалить.

Любые идеи?

+0

где cat.Id == Convert.ToInt32 (Id) никогда не будет обрабатывать случай, когда продукт имеет идентификатор нулевой категории. – JimmyV

+0

Он работает, когда CategoryId используется продуктом. Но когда CategroId не используется никаким продуктом, я не могу его удалить. Зачем? – Peter

+0

У вас есть дочерние записи, возможно, вы должны убедиться, что если есть от 1 до многих отношений и т. Д., Которые вы удаляете снизу вверх, то это означает, что родительская запись будет последней, которая будет удалена .. это предотвратит наличие сиротских записей в вашей базе данных .. также почему бы вам не обернуть код вокруг try catch, где вы пытаетесь удалить, и сообщить нам, что такое сообщение об ошибке .., что поможет вам понять, почему вещи не удаляются .. – MethodMan

ответ

1

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

var products = (from prod in DataContext.Products 
       where prod.CategoryId == Convert.ToInt32(Id) 
       select prod).ToList(); 

foreach(Product p in products) 
{ 
    p.CategoryId = null; 
} 

DataContext.SubmitChanges(); 

..... 

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

+1

СПАСИБО ВАМ ОЧЕНЬ! Я не могу голосовать за ваш ответ, но ты помог мне! Я получил свою ошибку ... еще раз - большое спасибо! – Peter

+0

@Peter: но вы можете [** принять этот ответ **] (http://meta.stackoverflow.com/q/5234/153998) !! :-) ;-) :-) Это покажет вашу признательность тем, кто * провел свое время, чтобы помочь вам *. –

0

Simple! Измените конфигурацию таблицы продуктов в базе данных!

ALTER TABLE Product 
ADD CONSTRAINT 'Category_FK' 
    FOREIGN KEY (CategoryId) 
    REFERENCES Category(Id) 
    ON DELETE SET NULL; 

всякий раз, когда вы удаляете первичный ключ, автоматически ставится нуль!

0

Cascade on Delete есть в инфраструктуре сущности. Cascade delete автоматически удаляет зависимые записи или задает свойства null для чужих клавиш, когда основная запись удаляется.

Это один ко многим reletionship между родителем и ребенком

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(a => a.UserDetail) 
     .WithOptionalDependent() 
     .WillCascadeOnDelete(true); 
} 

Для получения более подробной информации проверить это: http://www.entityframeworktutorial.net/code-first/cascade-delete-in-code-first.aspx