实体框架可以生成从外键到父表中 GUID 的映射吗?

Sam*_*tar 4 sql-server asp.net entity-framework

我的数据库有两个这样的表(删除了一些列以保持简单)

CREATE TABLE [dbo].[Question] (
    [QuestionId]       INT              IDENTITY (1, 1) NOT NULL,
    [ProblemId]        INT              NOT NULL,
    [QuestionUId]      UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    CONSTRAINT [PK_Question] PRIMARY KEY CLUSTERED ([QuestionId] ASC)
);

CREATE UNIQUE NONCLUSTERED INDEX [Question_QuestionUId_UIX]
    ON [dbo].[Question]([QuestionUId] ASC);

CREATE TABLE [dbo].[AdminTestQuestion] (
    [AdminTestQuestionId] INT              IDENTITY (1, 1) NOT NULL,
    [AdminTestId]         INT              NOT NULL,
    [QuestionNumber]      INT              NOT NULL,
    [QuestionUId]         UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT [PK_AdminTestQuestion] PRIMARY KEY CLUSTERED ([AdminTestQuestionId] ASC),
    CONSTRAINT [FK_AdminTestQuestionQuestionUId] FOREIGN KEY ([QuestionUId]) REFERENCES [dbo].[Question] ([QuestionUId])
);
Run Code Online (Sandbox Code Playgroud)

当我运行实体框架逆向工程师时,它不会创建来自 AdminTestQuestion > Question 的映射,并且不会在 Question 类中创建 AdminTestQuestions 的集合。我希望看到这样的东西,但据我了解,当外键的一端是 GUID 时,就会遇到困难。

public partial class Question
{
    public Question()
    {
        this.Answers = new List<AdminTestQuestion>();
    }
    public int QuestionId { get; set; }
    public int ProblemId { get; set; }
    public System.Guid QuestionUId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我还期望 AdminTestQuestion 映射文件中存在类似这样的映射信息:

        this.HasRequired(t => t.QuestionUId)
            .With????(t => t.Questions)
            .HasForeignKey(d => d.QuestionUId);
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我可以使用 EF6+ 创建这种到 GUID 的映射吗?

Eri*_*kEJ 5

EF6 无法执行此操作,因为它不知道 QuestionUId 列上的唯一索引。执行此操作的唯一方法是将 QuestionUId 设为 Question 表中的主键,我认为没有什么可以阻止您这样做:

CREATE TABLE [dbo].[Question] (
    [QuestionId]       INT              IDENTITY (1, 1)  NOT NULL,
    [ProblemId]        INT              NOT NULL,
    [QuestionUId]      UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    CONSTRAINT [PK_Question] PRIMARY KEY CLUSTERED ([QuestionUId] ASC)
);

CREATE TABLE [dbo].[AdminTestQuestion] (
    [AdminTestQuestionId] INT              IDENTITY (1, 1) NOT NULL,
    [AdminTestId]         INT              NOT NULL,
    [QuestionNumber]      INT              NOT NULL,
    [QuestionUId]         UNIQUEIDENTIFIER NOT NULL,
    CONSTRAINT [PK_AdminTestQuestion] PRIMARY KEY CLUSTERED ([AdminTestQuestionId] ASC),
    CONSTRAINT [FK_AdminTestQuestionQuestionUId] FOREIGN KEY ([QuestionUId]) REFERENCES [dbo].[Question] ([QuestionUId])
);
Run Code Online (Sandbox Code Playgroud)

生成(使用数据库中的 Code First):

public partial class Question
{
    public Question()
    {
        AdminTestQuestion = new HashSet<AdminTestQuestion>();
    }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionId { get; set; }
    public int ProblemId { get; set; }
    [Key]
    public Guid QuestionUId { get; set; }
    public virtual ICollection<AdminTestQuestion> AdminTestQuestion { get; set; }
}

public partial class AdminTestQuestion
{
    public int AdminTestQuestionId { get; set; }
    public int AdminTestId { get; set; }
    public int QuestionNumber { get; set; }
    public Guid QuestionUId { get; set; }
    public virtual Question Question { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Question>()
    .HasMany(e => e.AdminTestQuestion)
    .WithRequired(e => e.Question)
    .WillCascadeOnDelete(false);
}
Run Code Online (Sandbox Code Playgroud)