使用持久性ID的C#将XML数据加载到现有数据库中

时间:2018-12-06 08:37:48

标签: c# sql entity-framework tsql entity-framework-6

嗨,我正在尝试从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()    ;
                }

            }

0 个答案:

没有答案