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 的映射吗?
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)