Code First EF仅使用Id删除

时间:2013-08-01 23:06:52

标签: entity-framework-5

我有以下代码:

public void Remove(Guid id)
{

    var symbol = new Symbol()
                 {
                     Id = id
                 };
    _ctx.Entry(symbol).State = EntityState.Deleted;
    _ctx.SaveChanges();
}

符号实体有一个名为“Category”的相关实体。它没有设置为级联删除,因为它是查找表中的值。我想单独保留类别,但是当它运行时它会抛出一个DbUpdateException: 'HourlyContext.Symbols'中的实体参与'Symbol_Category'关系。找到0相关的'Symbol_Category_Target'。 1'Symbol_Category_Target'是预期的。

我理解EF对于如何处理这种关系感到困惑,我怎么能告诉它简单地丢弃对类别的引用并继续删除符号?

感谢。

修改

好的,所以我尝试通过添加可空的CategoryId as shown here来使外键可以为空(仅供参考我使用代码第一个实体框架):

public class Symbol : EntityBase
{
    [Required]
    public string CompanyName { get; set; }

    public int? CategoryId { get; set; }

    [Required]
    public MarketCategory Category { get; set; }
}

但是,在创建迁移并更新数据库之后,这不会解决异常。

编辑2

好的,事实证明(现在很明显),添加'required'属性会阻止列可以为空。现在我的意图是不允许编码器(即我)在代码中意外地将关系设置为null,但是当我通过Id删除对象时允许框架将其清空。似乎无法做到这一点。所以我需要做的就是删除所需的属性(并省略'categoryId'列)。

2 个答案:

答案 0 :(得分:0)

EF必须存在外键关系。简单的检查方法是使用SQL服务器managent Studio并检查表中的依赖性

Right click on table and select Show dependencies

答案 1 :(得分:0)

为此,我认为Category表的外键列(SymbolId,等等......)应该是Nullable。数据库表的OndDelete操作也应该设置为null。

然后,EF可以简单地删除该符号。