当附加实体上的相关实体设置为null时,删除外键



我有一个DAO类,用于更新从客户端应用程序接收的实体。因此,我将实体附加到上下文中,但如果相关实体在客户端中设置为null,则在保存后,数据库中的外键不会设置为null。然后,当我查询实体时,相关实体仍然存在。

在这种情况下,我如何删除外键?(我无法手动检查每个属性,因为模型太大了(

EDIT:当我在dbcontext中查询去实体时,它工作得很好,问题是当在客户端中修改实体,然后将其附加到dbcontext时。

这是一个示例:当我在Address表的int中设置person.Address.Neighborhood = null;时,NeighborhoodId属性仍然是7

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; }
}

问题是(可能是一个bug?(.State = EntityState.Modified;没有将null引用导航属性标记为已修改(否则它会对基元和非null引用导航属性进行标记(。

修复/解决方法是在使用以下代码设置实体状态后手动将其标记为已修改:

foreach (var reference in _context.Entry(person).References)
reference.IsModified = true;

Person模型应该有一个可以为null的地址实体

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

最新更新