2016-08-08 3 views
1

У меня есть код Первая модель в Entity Framework версии 6.1.1, которая в основном выглядит следующим образом:EF Отношение (1 до 0..1) не будет удалено

public class TinMan { 
    public int Id { get; set; } 
    public virtual Heart Heart { get; set; } 
} 

public class Heart { 
    public int Id { get; set; } 
} 

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

TinMen:     Hearts: 

Id Heart_Id   Id 
1  1     1 
2  3     2 
3  NULL    3 

Создание отношения, где ни один не существует, или изменение существующего отношения работает просто отлично:

using (MyDbContext dbContext = new MyDbContext()) { 
    TinMan bill = dbContext.TinMen.FirstOrDefault(man => man.Id == 1); 
    if (bill != null) bill.Heart = 2; 
    TinMan bob = dbContext.TinMen.FirstOrDefault(man => man.Id == 3); 
    if (bob != null) bob.Heart = 1; 
    dbContext.SaveChanges(); 
} 

Теперь я пытаюсь удалить соотношение:

using (MyDbContext dbContext = new MyDbContext()) { 
    TinMan jebediah = dbContext.TinMen.FirstOrDefault(man => man.Id == 2); 
    if (jebediah != null) jebediah.Heart = null; 
    dbContext.SaveChanges(); 
} 

После этого была выполнена жестянщика с ID == 2 еще имеет сердце в базе данных, то есть он был не набор для NULL в базе данных.

Почему?

+0

Это не объясняет, почему установка свойства «null» не работает, но учтите, что без дополнительной настройки EF будет рассматривать отношение «один ко многим» от «Сердце» до «TinMan». –

ответ

2

Попробуйте это:

using (MyDbContext dbContext = new MyDbContext()) 
{ 
    TinMan jebediah = dbContext.TinMen.FirstOrDefault(man => man.Id == 2); 
    context.Entry(jebediah).Reference(t => t.Heart).CurrentValue = null; 
    dbContext.SaveChanges(); 
} 

Это альтернативный способ сделать это, основываясь на мой комментарий:

using (MyDbContext dbContext = new MyDbContext()) 
{ 
    TinMan jebediah = dbContext.TinMen.FirstOrDefault(man => man.Id == 2); 
    context.Entry(jebediah).Reference(t => t.Heart).Load(); 
    jebediah.Heart = null; 
    dbContext.SaveChanges(); 
} 

В любом случае, это сценарий, где наличие явного внешнего ключа собственности (например, public int? HeartId { get; set; }. При наличии свойства внешнего ключа вы можете удалить взаимосвязь без предварительной загрузки связанного объекта. Например:

using (MyDbContext dbContext = new MyDbContext()) 
{ 
    TinMan jebediah = dbContext.TinMen.FirstOrDefault(man => man.Id == 2); 
    jebediah.HeartId = null; 
    dbContext.SaveChanges(); 
} 
+0

Это то, что я изучал во время вашего ответа. Я попробовал, и это сработало. Любая идея, почему просто установка свойства на «null» не работает? – GTHvidsten

+0

Когда вы загружаете сущность 'TinMan' из базы данных, соответствующее« Сердце »еще не загружается, потому что включена ленивая загрузка. Поэтому, когда вы устанавливаете значение «null» в этот момент, на самом деле ничего не происходит в отношении EF. Установка соответствующего 'Сердца' на' null' будет работать _if_, она была загружена заранее. Я обновил свой ответ (включил пример). –

Смежные вопросы