EF外键设置

时间:2018-03-07 13:13:47

标签: c# entity-framework

我对实体框架6中的外键设置有疑问。我们的项目存储来自其他一些服务的数据(以便更快地访问数据),并根据存储的数据为用户提供图表和统计信息。为了存储数据,我们设置了一个每天凌晨3点左右运行的cronjob。

以下是两个示例数据库模型:

public class Project {
    public string Id { get; set; }
    public string Title { get; set; }
}

public class Issue {
    public string Id { get; set; }
    public string Title { get; set; }
    [ForeignKey("Project")]
    public string ProjectId { get; set; }
    [ForeignKey("ProjectId")]
    public Project Project { get; set; }
}

现在的问题是我们没有保存它所依赖的项目的一些问题,但是我们必须保存ProjectId(因为稍后我们的数据库中可能存在项目)。因此,当我尝试保存此问题时,它告诉我我无法保存它们,因为项目不存在。

有什么办法可以告诉实体框架项目是否存在无关紧要?目前我刚刚删除了ForeignKeys,但是当我试图获得他们项目的完整问题列表时,这会非常慢。

或者,如果没有外键,还有其他方法可以读出他们项目的所有问题吗?目前我正在使用foreach循环来抛出每个问题,然后我搜索项目但是有超过10.000个问题,这个问题非常缓慢。

1 个答案:

答案 0 :(得分:0)

您定义的导航属性需要Project表中的数据才能保存Issue。这不是实体框架,这是SQL Server外键约束问题。实体框架正在进行初步验证,以避免浪费最终失败的连接。虽然您可以关闭强制执行外键约束,但是没有一种好方法可以在实体框架中关闭此验证

请注意,拥有外键并不意味着它有助于查询的效果。它只是一种强制引用完整性的方法。我怀疑你真正的问题是你编写查询的方式。如果没有看到您的查询和指标"慢",就很难指出正确的方向。