Удалить внешний ключ, когда для связанной сущности установлено нулевое значение на присоединенной сущности - PullRequest
0 голосов
/ 03 декабря 2018

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

Как я могу удалить ключ в этом случае?(Я не могу проверить каждое свойство вручную, потому что модель слишком большая)

EDIT: Это прекрасно работает, когда я запрашиваю de entity в dbcontext, проблема заключается в том, чтоизменено в клиенте и затем присоединено к dbcontext.

Это пример: когда я устанавливаю person.Address.Neighborhood = null; свойство NeighborhoodId все еще 7 в int Адрес Таблица.

var person = new Person
{
    Id = 1,
    Name = "Juan",
    Adress = new Address
    {
        Id = 3,
        StreetName = "Calle Falsa",
        StreetNumber = "123",
        Neighborhood = new Neighborhood
        {
            Id = 7,
            Description = "my Neighborhood"
        },
    }
};

person.Address.Neighborhood = null; 

_context.Attach(person);
_context.Entry(person).State = EntityState.Modified;
var unchange = _context.ChangeTracker.Entries().Where(e => e.State == EntityState.Unchanged).ToList();
if (unchange != null && unchange.Count > 0)
{
    foreach (var unaEntidad in unchange )
    {
        _context.Entry(unaEntidad.Entity).State = EntityState.Modified;
    }
}

_context.SaveChanges();

РЕДАКТИРОВАТЬ: Классы:

public class Person
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual Address Address { get; set; }
}

public class Address
{
    public virtual int Id { get; set; }
    public virtual string StreetName { get; set; }
    public virtual string StreetNumber { get; set; }
    public virtual Neighborhood Neighborhood { get; set; }
}

public class Neighborhood
{
    public virtual int Id { get; set; }
    public virtual string Description { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Проблема (может быть, ошибка?) В том, что .State = EntityState.Modified; не помечает null ссылочные навигационные свойства как измененные (что в противном случае это делает для примитивных и ненулевых ссылочных навигационных свойств).

Исправление / обходной путь заключается в том, чтобы вручную пометить их как измененные после установки состояния объекта с помощью кода, подобного следующему:

foreach (var reference in _context.Entry(person).References)
    reference.IsModified = true;
0 голосов
/ 03 декабря 2018

Модель персонажа должна иметь обнуляемый адресный объект

public class Person {
  public Nullable<Address> Adress {get;set;}
}
...