【问题标题】:What is the proper way to remove a reference using the .NET 4 Entity Framework?使用 .NET 4 Entity Framework 删除引用的正确方法是什么?
【发布时间】:2012-11-13 20:04:10
【问题描述】:

我有一个名为projectVersionTPM_PROJECTVERSION 实例,它有一个名为TPM_USER5 的属性,其类型为TPM_USERTPM_PROJECTVERSION 可以有零个或一个 TPM_USER5 引用(抱歉,我没有想出这些名称。)

当用户单击删除按钮时,我想删除此引用,从而将数据库中的列设置为空。我尝试了以下方法:

projectVersion.TPM_USER5 = null;

但是,当我调用context.SaveChanges() 时,该列没有更新,也没有任何反应。在调试器下,我可以看到projectVersion.TPM_USER5 确实为null,我也看到projectVersion.TPM_USER5Reference.IsLoaded 为true。我也试过:

context.DeleteObject(projectVersion.TPM_USER5);

如果我这样做,当我调用 context.SaveChanges() 时,我会收到异常:

{"ORA-02292: 完整性约束 (TPMDBO.TPM_PROJECTCHANGES_TPM_US_FK1) 违反 - 找到子记录”}

我很乐意发布有关实体映射的更多信息,但不确定具体是什么。有什么想法吗?

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4


    【解决方案1】:

    如果我理解正确,那么您只删除导航属性 (TPM_USER5)。尝试将原始属性(TPM_USER5ID? - 可能是您的数据库列名)设置为 null。

    每个导航属性都必须具有相关的原始属性(不是 POCO 实体),您可以使用两者将用户关联到 TPM_USER5(原始属性 - 设置 id,导航属性 - 设置引用)。

    【讨论】:

    • 我不认为有 TPM_USER5 的原始表示。这是对TPM_USER 实体的引用。我可以设置TPM_USER5.USERID,但它是小数,所以不能为空。
    • 没关系,你是 100% 正确的。 TPM_USER5 实际上是基于外键约束的关系,有一个名称完全不同的实际属性(Decimal? 类型)。将 that 设置为 null 效果很好。
    • 是的,我通过导航属性名称猜到了这个名称...我很高兴它有帮助。
    • 是的 - 最初编写此代码的人只是使用了“从数据库导入”向导中的所有默认值,因此所有名称都没有任何意义(例如 TPM_USER1 - TPM_USER7 映射到谁知道什么)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多