Entity framework core 如何在具有不包含外键的现有数据库的实体之间创建关系

Entity framework core 如何在具有不包含外键的现有数据库的实体之间创建关系,entity-framework-core,entity-framework-core-2.1,Entity Framework Core,Entity Framework Core 2.1,使用实体框架核心2.0 坚持使用公司的生产数据库,该数据库为每个表定义了主键,但没有为任何关系定义外键 数据库中的从属记录具有与父记录的主键字段相关的id字段,这与外键关系/约束的情况类似。但这些字段都创建为INT NOT NULL,并使用SQL默认值“0” 因此,随着时间的推移,已插入依赖记录,而无需指定相关的父记录 最初,我用整数在EF中定义模型,并使用流畅的配置指定“IsRequired”。这样做是为了我可以运行迁移来创建一个测试数据库,以便与生产数据库进行比较,以验证我的代码首先是正确编

使用实体框架核心2.0

坚持使用公司的生产数据库,该数据库为每个表定义了主键,但没有为任何关系定义外键

数据库中的从属记录具有与父记录的主键字段相关的id字段,这与外键关系/约束的情况类似。但这些字段都创建为INT NOT NULL,并使用SQL默认值“0”

因此,随着时间的推移,已插入依赖记录,而无需指定相关的父记录

最初,我用整数在EF中定义模型,并使用流畅的配置指定“IsRequired”。这样做是为了我可以运行迁移来创建一个测试数据库,以便与生产数据库进行比较,以验证我的代码首先是正确编码的

这会导致在我的Linq查询中使用“Include”时出现问题,该查询执行内部联接,导致删除依赖记录的id字段中包含0的记录

我发现实现这一点的唯一方法是将依赖实体中的所有id字段建模为可为空的整数,并从fluent配置中删除“IsRequired”

当使用“Include”时,它执行一个左外连接,保留所有依赖实体。这也意味着包含的实体上的任何引用属性都被设置为null,而不是空字符串。这部分可能很容易修复

缺点是,如果我现在想使用迁移创建数据库,那么依赖记录中的所有id字段都将创建为NULL


有没有人遇到过这种情况?除了我正在使用的方法之外,还有人建议尝试其他方法吗?

我以前没有处理过这种情况,但我想知道您是否可以通过将FK属性定义为可空,然后在迁移中,在创建迁移后,编辑它以添加HasDefaultValue属性以确保它为0来解决这个问题?(该迁移方法的文档:)

我创建了一个可为空的id字段,添加了一个外键数据注释以引用导航属性。在我的配置对象中,我使用fluent API添加了值为(“”)的“HasDefaultValueSql”。在迁移文件中,我将“id”更改为nullable:false,并删除了添加到表中的外键约束。我留下了为外键添加的索引,因为我现有的db表中的所有“id”字段都有索引。我在两个方向上测试了EF导航。仔细检查所有计数。左外连接工作正常。Thanx,Julie,谢谢你让我走上正轨这是一个很大的骗局。它起作用了吗?如果你能少做一些调整就能成功的话,我会很感兴趣的。也许让迁移符合现有的数据库不是必要的。我认为它应该是完整的e2e,使用EF不仅可以与当前的DB交互,还可以复制它并使用迁移来完成。考虑到这个特定db的当前状态(没有标识列,没有FK,等等),我的想法可能有偏差。在第二次尝试中,我简单地将表示外键的id字段设置为int?然后在我的类型配置文件中,我将“HasDefaultValue”用作0。所有CRUD操作均按预期执行。使用include会产生LOJ的首选结果。由于db是手头上的真正问题,如果使用更新的技术(目前为VB6)重写此db支持的应用程序,我考虑了两个选项。第一个选项是放弃原始模式,根据未来开发的需求创建新模式,同时尝试迁移高度重要的数据。第二种方法是以安全的方式对现有数据库数据进行更改,以允许添加所需的约束。另外,db没有任何标识列,它使用一个keys表来跟踪db中每个表的下一个主键。