EF6代码优先-使用不匹配的外键配置一对一关系

斯蒂芬·柯林斯

我正在使用Code First定义现有数据库的架构。我遇到的问题是它们在表中的键名不太一致。这对一对多关系很好,因为我可以使用该HasForeignKey()方法,但是一对一关系似乎并不等效。我的表定义是:

namespace Data.Mappings {

    internal class DocumentTypeConfiguration : EntityTypeConfiguration<Document> {

        public DocumentTypeConfiguration() {
            ToTable("ProsDocs");

            HasKey(m => m.Id);

            Property(m => m.Id)
                .HasColumnName("ProsDocId")
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

            // ---- This is the foreign key ----
            Property(m => m.TypeId)
                .HasColumnName("ProsDocTypeId")
                .HasMaxLength(3);

            HasRequired(d => d.DocType)
                .WithRequiredDependent(dt => dt.Document);
                // I need to specify here that the foreign key is named "DocTypeId" and not "DocType_Id"
        }
    }

    internal class DocTypeTypeConfiguration : EntityTypeConfiguration<DocType> {

        public DocTypeTypeConfiguration() {
            ToTable("DocType");

            HasKey(m => m.Id);

            // ---- This is the "child" end of the foreign key ----
            Property(m => m.Id)
                .HasColumnName("DocTypeId")
                .HasMaxLength(4);

            Property(m => m.FullName)
                .HasColumnName("DocTypeDesc")
                .HasMaxLength(255);

            Property(m => m.Priority)
                .HasColumnName("DocPriority");

            // Or would it be easier to define it here?
//            HasRequired(m => m.Document)
//                .WithRequiredDependent(d => d.DocType);
        }
    }
}

为了阐明模型,每个模型Document都有一个DocType,具有的外键关系Document.ProsDocTypeId --> DocType.Id

有没有一种方法可以定义一对一关系的键的列名?

编辑:我想我的架构不清楚。

dbo.DocType
-----------
DocTypeId char(4) (PK)
DocTypeDesc varchar(255)

dbo.ProsDocs
------------
ProsDocId int (PK)
ProsDocTypeId char(4)

基本上,我需要结果查询如下所示:

SELECT 
    [Extent1].[ProsDocId] AS [ProsDocId], 
    [Extent2].[DocTypeId] AS [DocTypeId]
    FROM  [dbo].[ProsDocs] AS [Extent1]
    LEFT OUTER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocTypeId] = [Extent2].[DocTypeId]
    WHERE [Extent1].[ProsId] = @EntityKeyValue1

但是相反,由于EF假定我要使用主键(dbo.ProsDocs.ProsDocId)而不是外键(dbo.ProsDocs.DocTypeId),因此它生成的查询是这样的:

SELECT 
    [Extent1].[ProsDocId] AS [ProsDocId], 
    [Extent2].[DocTypeId] AS [DocTypeId]
    FROM  [dbo].[ProsDocs] AS [Extent1]
    LEFT OUTER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocId] = [Extent2].[ProsDocTypeId]
    WHERE [Extent1].[ProsId] = @EntityKeyValue1

区别在于:

理想查询:

LEFT OUTER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocTypeId] = [Extent2].[DocTypeId]

当前查询:

LEFT OUTER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocId] = [Extent2].[ProsDocTypeId]

我需要之间建立一对一的关系EF遇到的问题是它只想使用主键而不是外键来创建关系。如何指定外键的列名,以使每个外键都只有一个dbo.ProsDocs.ProsDocTypeIddbo.DocType.DocTypeIdDocumentDocType

尤里亚姆·钱德拉

如果theDocument是委托人,并且DocType是从属人,那么您要么需要

  • 启用此配置 Document

    HasRequired(d => d.DocType).WithRequiredPrincipal(dt => dt.Document);
    
  • 还是这个配置上 DocType

    HasRequired(dt => dt.Document).WithRequiredDependent(d => d.DocType);
    

从中删除TypeId/ProsDocTypeId属性,Document因为主体不能具有要依赖的外键ID,除非不是约束,而是普通列。

更新

实体:

public class Document
{
    public string Id { get; set; }
    // This entity is a principal. It can't have foreign key id to dependent.
    // public string TypeId { get; set; }
    public DocType DocType { get; set; }
}

Linq:

db.Documents.Include(d => d.DocType)

询问:

 SELECT
    1 AS [C1],
    [Extent1].[ProsDocId] AS [ProsDocId],
    [Extent2].[DocTypeId] AS [DocTypeId],
    FROM  [dbo].[ProsDocs] AS [Extent1]
    LEFT OUTER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocId] = [Extent2].[DocTypeId]

更新2

为了实现理想的查询,您需要的关系是一对多的。一个DocType可以有很多Document

public class Document
{
    public string Id { get; set; }
    public string TypeId { get; set; }
    public DocType DocType { get; set; }
}
public class DocType
{
    public string Id { get; set; }
    public string FullName { get; set; }
    public string Priority { get; set; }
    public ICollection<Document> Documents { get; set; }
}

上的配置Document

更改此:

HasRequired(d => d.DocType).WithRequiredDependent(dt => dt.Document);

进入:

HasRequired(d => d.DocType).WithMany(dt => dt.Documents).HasForeignKey(d => d.TypeId);

Linq:

db.Documents.Include(d => d.DocType)

询问:

SELECT
    1 AS [C1],
    [Extent1].[ProsDocId] AS [ProsDocId],
    [Extent1].[ProsDocTypeId] AS [ProsDocTypeId],
    [Extent2].[DocTypeId] AS [DocTypeId],
    FROM  [dbo].[ProsDocs] AS [Extent1]
    INNER JOIN [dbo].[DocType] AS [Extent2] ON [Extent1].[ProsDocTypeId] = [Extent2].DocTypeId]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

EF6代码优先:使用Fluent API声明外键

来自分类Dev

EF:一对一关系中的外键?

来自分类Dev

如何以EF6代码优先的方式删除实体之间的关系?

来自分类Dev

如何为一个模型创建两个导航属性(EF6代码优先)

来自分类Dev

如何在EF6代码优先中对数据库上下文使用通用类型

来自分类Dev

是否可以在EF中以一对一关系分配外键?

来自分类Dev

如何在EF6代码优先中将泛型类型与数据库上下文一起使用

来自分类Dev

EF代码优先:使用数据注释设置可选的一对一关系

来自分类Dev

EF6代码优先数据库初始化期间发生InvalidOperationException(必须显式配置此关联的主要末尾)

来自分类Dev

使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

来自分类Dev

使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

来自分类Dev

实体框架代码优先一对一关系

来自分类Dev

代码优先的可选一对一关系

来自分类Dev

首先在EF6代码中创建多对多关系

来自分类Dev

EF6代码第一个多个一对多映射问题/“多重性”错误

来自分类Dev

EF6代码第一个多个一对多映射问题/“多重性”错误

来自分类Dev

EF7一对一关系

来自分类Dev

一对零或一对一关系的实体框架(EF)代码优先级联删除

来自分类Dev

EF6代码优先模型ForeignKey

来自分类Dev

实体框架6代码优先一对多可选关系消除子问题

来自分类Dev

如何使用“数据库优先”建立一对一关系?

来自分类Dev

EF6代码首先使用数据注释来填充有关SQL表和列的描述

来自分类Dev

EF6代码首先使用数据注释来填充有关SQL Table和Colums的描述

来自分类Dev

实体框架首先使用代码一对一关系。怎么样?

来自分类Dev

具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

来自分类Dev

C#EF6代码优先TPH-导航到使用注释侵犯同一实体的两个实体的属性

来自分类Dev

EF Core中的一对一关系(无法确定孩子/受抚养人之间的一对一关系)

来自分类Dev

实体框架6:具有继承关系的一对一关系

Related 相关文章

  1. 1

    EF6代码优先-使用不匹配的外键配置一对一关系

  2. 2

    EF6代码优先:使用Fluent API声明外键

  3. 3

    EF:一对一关系中的外键?

  4. 4

    如何以EF6代码优先的方式删除实体之间的关系?

  5. 5

    如何为一个模型创建两个导航属性(EF6代码优先)

  6. 6

    如何在EF6代码优先中对数据库上下文使用通用类型

  7. 7

    是否可以在EF中以一对一关系分配外键?

  8. 8

    如何在EF6代码优先中将泛型类型与数据库上下文一起使用

  9. 9

    EF代码优先:使用数据注释设置可选的一对一关系

  10. 10

    EF6代码优先数据库初始化期间发生InvalidOperationException(必须显式配置此关联的主要末尾)

  11. 11

    使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

  12. 12

    使用EF6代码优先的MySQL现有数据库-带有脚手架的控制器创建错误

  13. 13

    实体框架代码优先一对一关系

  14. 14

    代码优先的可选一对一关系

  15. 15

    首先在EF6代码中创建多对多关系

  16. 16

    EF6代码第一个多个一对多映射问题/“多重性”错误

  17. 17

    EF6代码第一个多个一对多映射问题/“多重性”错误

  18. 18

    EF7一对一关系

  19. 19

    一对零或一对一关系的实体框架(EF)代码优先级联删除

  20. 20

    EF6代码优先模型ForeignKey

  21. 21

    实体框架6代码优先一对多可选关系消除子问题

  22. 22

    如何使用“数据库优先”建立一对一关系?

  23. 23

    EF6代码首先使用数据注释来填充有关SQL表和列的描述

  24. 24

    EF6代码首先使用数据注释来填充有关SQL Table和Colums的描述

  25. 25

    实体框架首先使用代码一对一关系。怎么样?

  26. 26

    具有相同类型导航属性集合的EF6代码第一实体-如何告诉EF是什么关系?

  27. 27

    C#EF6代码优先TPH-导航到使用注释侵犯同一实体的两个实体的属性

  28. 28

    EF Core中的一对一关系(无法确定孩子/受抚养人之间的一对一关系)

  29. 29

    实体框架6:具有继承关系的一对一关系

热门标签

归档