【问题标题】:Delete foreign key when related entity is set to null on attached entity当相关实体在附加实体上设置为空时删除外键
【发布时间】:2018-12-03 03:07:30
【问题描述】:

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

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

编辑:当我在 dbcontext 中查询实体时它工作正常,问题是当实体在客户端被修改然后附加到 dbcontext。

这是一个例子:当我在 Address 表中设置person.Address.Neighborhood = null; NeighborhoodId 属性still 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; }
}

【问题讨论】:

  • 那么您是要删除关系only 还是删除entity 从而删除关系?
  • 仅关系
  • 您可以编辑您的帖子以显示PersonNeigbourhood 的课程吗?
  • 我已经编辑了问题。
  • 为什么是 AddressId 个人?

标签: c# entity-framework ef-core-2.0 ef-core-2.1


【解决方案1】:

问题是(可能是一个错误?).State = EntityState.Modified; 没有将 null 引用导航属性标记为已修改(否则它会为原始和非 null 引用导航属性标记)。

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

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

【讨论】:

  • 不幸的是,它不起作用。当我从 dbcontext 查询实体然后将相关实体设置为空并保存更改时,它工作正常。问题是在客户端修改实体然后附加到dbcontext并保存更改时
  • 我总是在发布解决方案之前进行测试,它对我有用。我所做的只是从帖子中获取您的代码(显然使用了断开连接的对象)并在_context.Attach(person); context.Entry(person).State = EntityState.Modified; 之后添加上面的 sn-p。然后SaveChages 生成UPDATE 命令和null 用于FK。 `
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多