asp.net - Entity Framework 可以生成从外键到父表中 GUID 的映射吗?

标签 asp.net sql-server 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])
);

当我运行 Entity Framework 逆向工程师时,它不会从 AdminTestQuestion > 问题创建映射 并且它不会在 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; }
}

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

        this.HasRequired(t => t.QuestionUId)
            .With????(t => t.Questions)
            .HasForeignKey(d => d.QuestionUId);

有人可以建议我可以使用 EF6+ 创建这种到 GUID 的映射吗?

最佳答案

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])
);

生成(使用数据库中的 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);
}

关于asp.net - Entity Framework 可以生成从外键到父表中 GUID 的映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998601/

相关文章:

C# 使用 SQLBulkCopy 或等效库高效地批量删除 50000 条记录

javascript - 如何使用 Jquery 从 Asp.net MVC 中的 CheckBox 中获取选定的值?

c# - 必须声明标量 var ... 使用动态表名

asp.net - 需要有关选择数据访问方法的建议

c# - 重定向到页面和按下后退按钮后进入同一页面之间的区别?

asp.net - 如何正确处理复合控件中子控件的 View 状态?

sql-server - SQL Server XML查询: Query multiple child elements with same name

sql-server - 如何使用 azure devops 管道执行 sql 脚本

MySQL 数据库设计问题

c# - 使用 EntityFramework Extended 批量插入