【发布时间】:2015-02-11 19:33:20
【问题描述】:
我正在尝试将数据播种到 Entity Framework 6 中新创建的数据库中。(或即时替换它)这是出于开发/测试目的,也可能用于未来的生产安装。我有几个从生产环境导出的 XML 文件,我需要这些文件才能进入开发和测试环境。要做到这一点,我需要将主键保留在查找表中。下面的代码显示了我最终是如何工作的。我花了一天时间寻找“正确的方法”来做这件事,遗憾的是最终硬编码了一个查询字符串,如代码所示。
public void Add(QuestionType questionType)
{
using (var context = new SurveyFromDBContext())
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try
{
context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [Kiosk].[QuestionTypes] ON");
string sql = "INSERT INTO [KIOSK].[QuestionTypes] ( [Id], [Name], [Description]) VALUES (" +
questionType.Id + ", '" + questionType.Name + "', '" + questionType.Description + "')";
context.Database.ExecuteSqlCommand(sql);
//context.QuestionTypes.Add(questionType);
context.SaveChanges();
context.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [Kiosk].[QuestionTypes] OFF");
dbContextTransaction.Commit();
}
catch (Exception e)
{
dbContextTransaction.Rollback();
}
}
}
}
问题是:在 EF6 中,应该如何将记录插入到表中并保留主键?
请注意,由于遗留代码,主键需要能够自动更新,所以我不能这样做:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
除非可以以某种方式即时完成。
【问题讨论】:
-
您是在问如何将自己的值插入到通常自动生成的字段中?
-
您是否尝试将查询按原样转换为存储过程?至少这样你就可以保护自己免受 SQL 注入的影响。除此之外,我唯一的另一个想法是关闭数据库表上的标识(尽管这样做可能会导致无法预料的后果)
-
Claies:是的,这就是我想要做的。
-
user2366842:我想说我不能采用存储过程的方式,但我至少可以说我不想这样做。我试图弄清楚如何让实体框架进行插入但保留 PK 值。
标签: sql-server entity-framework entity-framework-6 sql-insert