嗨,我正在尝试从XML文件中读取数据并将数据泵送到现有数据库中。我处于需要ID与XML文件保持相同且正在使用EF6的情况下。
当我在不使用身份禁用部分的情况下运行此程序时,一切实际上都在工作。但是,这意味着所有ID都会自动递增,而不是我在数据库中设置的ID。
我的问题很简单我如何使用这种方法强制将我提供的ID用于数据库?
我正在EDMX对象和DTO对象之间进行转换,因此我可以从XML文件读取内容,而不会因EDMX文件与XML读取混乱而产生噪音。 我也知道这不是一个好主意,但这几乎是一次性的情况,我想尽可能地消除人为错误的可能性,因为我期望我必须将此方法扩展到大约50多种其他表键和主键。对于手动手写数据传输而言,只是太多数据。
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Model.Logic.DTO.DTORespondents, Model.Datamodel.Respondents>();
});
using (var ctxTest = new Model.Datamodel.MedicalNavigationTestDBEntities())
{
using (var transaction = ctxTest.Database.BeginTransaction())
{
//EXEC sys.sp_identitycolumnforreplication table_object_id, 1
string[] arrFilenames = Directory.GetFiles(fileNamePath);
List<Model.Datamodel.Respondents> dbRespondentsImportList = new List<Model.Datamodel.Respondents>();
foreach (string filename in arrFilenames)
{
var objRespondent = Program.DeSerializeObject<Model.Logic.DTO.DTORespondents>(Path.Combine(fileNamePath, filename));
dbRespondentsImportList.Add(Mapper.Map<Model.Datamodel.Respondents>(objRespondent));
}
foreach (Model.Datamodel.Respondents objRespondents in dbRespondentsImportList)
{
ctxTest.Respondents.Add(objRespondents);
//ctxTest.Respondents.FirstOrDefault(r => r.CollectUrl.Equals(objRespondents.CollectUrl)).Id = objRespondents.Id;
}
ctxTest.Database.ExecuteSqlCommand(@"declare @object_ids int;
set @object_ids = (select[object_id] from sys.objects WHERE [name] = 'respondents')
select @object_ids
EXEC sys.sp_identitycolumnforreplication @object_ids, 1");
ctxTest.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Respondents] ON");
ctxTest.SaveChanges();
ctxTest.Database.ExecuteSqlCommand("SET IDENTITY_INSERT [dbo].[Respondents] OFF");
ctxTest.Database.ExecuteSqlCommand(@"declare @object_ids int;
set @object_ids = (select[object_id] from sys.objects WHERE [name] = 'respondents')
select @object_ids
EXEC sys.sp_identitycolumnforreplication @object_ids, 1");
transaction.Commit() ;
}
}