我对实体框架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个问题,这个问题非常缓慢。
答案 0 :(得分:0)
您定义的导航属性需要Project
表中的数据才能保存Issue
。这不是实体框架,这是SQL Server外键约束问题。实体框架正在进行初步验证,以避免浪费最终失败的连接。虽然您可以关闭强制执行外键约束,但是没有一种好方法可以在实体框架中关闭此验证
请注意,拥有外键并不意味着它有助于查询的效果。它只是一种强制引用完整性的方法。我怀疑你真正的问题是你编写查询的方式。如果没有看到您的查询和指标"慢",就很难指出正确的方向。