entity-framework-6 - 在 C# MVC 实体框架中创建和使用不在 EF 模型中的动态表
问题描述
环境是C#、MVC、Entity Framework、SQL Server。数据类型是固定的,但表名不是。创建它是为了在运行期间利用某些 SQL 功能。它的名称因 UserId 而异。
问题是,在创建之后,当我遍历我的循环,做我的工作时,我做一个查询,然后是一个插入。那是记录1。没问题。下一次迭代,即查询,设置为提取刚刚添加的内容,但由于实体框架错误而失败。
完成后,可能有数百名用户同时通过此代码,我真的不想动态更改模型路线。我害怕在生产中炸毁 EF 模型。我想让这个尽可能简单。“TempProspect”类在 EF 模型之外。这个临时表也是如此。EF是否有可能因为它在“活动”模式中而参与其中?同一个数据库?希望不是。
创作:
int abc = db.Database.ExecuteSqlCommand
("IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='TempProspectsUid" + GlobalConstants.CurrentUser.UserId + "' AND xtype='U')" +
"CREATE TABLE [Campaigns].[TempProspectsUid" + GlobalConstants.CurrentUser.UserId + "]" +
"(" +
"[Id] [int] IDENTITY(1,1) NOT NULL," +
"[IdxMatchingFirstLastNames1] [varchar] (128) NULL," +
"[IdxMatchingFirstLastNames2] [varchar] (128) NULL," +
"[IdxMatchingStreet1] [varchar] (64) NULL," +
"[IdxMatchingCompanyName1] [varchar] (48) NULL," +
"[IdxMatchingCompanyName2] [varchar] (48) NULL," +
"[ProspectGroupId] [int] NULL," +
"[CompanyId] [int] NULL," +
"[CompanyName] [nvarchar](48) NULL," +
"[Department] [nvarchar](48) NULL," +
"[Division] [nvarchar](48) NULL," +
"[Position] [nvarchar](48) NULL," +
"[Gender] [char](1) NULL," +
"[DateOfBirth] [varchar](10) NULL," +
"[Title] [varchar](10) NULL," +
"[FirstName] [nvarchar](64) NULL," +
"[MiddleName1] [nvarchar](32) NULL," +
"[MiddleName2] [nvarchar](32) NULL," +
"[LastName] [nvarchar](64) NULL," +
"[NameSuffix] [nvarchar](16) NULL," +
"[PhoneHome] [varchar](24) NULL," +
"[PhoneMobile] [varchar](24) NULL," +
"[PhoneWork] [varchar](24) NULL," +
"[MobileProvider] [smallint] NULL," +
"[EmailPersonal] [varchar](64) NULL," +
"[EmailWork] [varchar](64) NULL," +
"[Language] [smallint] NULL," +
"[Street1] [varchar](64) NULL," +
"[Street2] [varchar](64) NULL," +
"[PobGeneral] [varchar](64) NULL," +
"[SpecialDelivery] [varchar](64) NULL," +
"[City] [varchar](64) NULL," +
"[StateOrProvince] [varchar](64) NULL," +
"[ZipOrPostalCode] [varchar](16) NULL," +
"[CountryCode] [int] NOT NULL," +
"CONSTRAINT [PK_TempProspectsUid" + GlobalConstants.CurrentUser.UserId + "] " +
"PRIMARY KEY CLUSTERED( [Id] ASC ), " +
"INDEX Idx_MatchingFirstLastNames1 NONCLUSTERED(IdxMatchingFirstLastNames1), " +
"INDEX Idx_MatchingFirstLastNames2 NONCLUSTERED(IdxMatchingFirstLastNames2), " +
"INDEX Idx_MatchingStreet1 NONCLUSTERED(IdxMatchingStreet1), " +
"INDEX Idx_MatchingCompanyName1 NONCLUSTERED(IdxMatchingCompanyName1), " +
"INDEX Idx_MatchingCompanyName2 NONCLUSTERED(IdxMatchingCompanyName2)" +
"WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, " +
"ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) " +
"ON [PRIMARY]) " +
"ON [PRIMARY]"
);
QUERY:(我尝试过很多不同的语法,包括 Object[] 和 SQLParameter 等,都失败,结果相同)
lstTempProspects = db.Database.SqlQuery ($"SELECT * FROM [Campaigns].[TempProspectsUid{GlobalConstants.CurrentUser.UserId}] WHERE IdxMatchingFirstLastNames2 = '{qm1}'").ToList();
插入:
int numberOfRowsInserted = db.Database.ExecuteSqlCommand
(@"INSERT INTO [Campaigns].[TempProspectsUid" + GlobalConstants.CurrentUser.UserId + "] " +
"(IdxMatchingFirstLastNames1, IdxMatchingFirstLastNames2, IdxMatchingStreet1, " +
"IdxMatchingCompanyName1, IdxMatchingCompanyName2, ProspectGroupId, CompanyId, " +
"CompanyName, Department, Division, Position, Gender, DateOfBirth, " +
"Title, FirstName, MiddleName1, MiddleName2, LastName, NameSuffix, " +
"PhoneHome, PhoneMobile, PhoneWork, MobileProvider, EmailPersonal, " +
"EmailWork, Language, Street1, Street2, PobGeneral, SpecialDelivery, " +
"City, StateOrProvince, ZipOrPostalCode, CountryCode) " +
"VALUES " +
"('" +
tp.IdxMatchingFirstLastNames1 + "', '" + tp.IdxMatchingFirstLastNames2 + "', '" +
tp.IdxMatchingStreet1 + "', '" + tp.IdxMatchingCompanyName1 + "', '" +
tp.IdxMatchingCompanyName2 + "', 0, 0, '" + tp.CompanyName + "', '" +
tp.Department + "', '" + tp.Division + "', '" +
…….
tp.Street1 + "', '" + tp.Street2 + "', '" + tp.PobGeneral + "', '" +
tp.SpecialDelivery + "', '" + tp.City + "', '" + tp.StateOrProvince + "', '" +
tp.ZipOrPostalCode + "', '" + tp.CountryCode + "')"
错误:
抛出异常:EntityFramework.dll 中的“System.InvalidOperationException”抛出异常:mscorlib.dll 中的“System.InvalidOperationException”
解决方案
业余错误/简单调试解决方案(try/catch):
在意识到我需要更多提示之后: 抛出异常:EntityFramework.dll 中的“System.InvalidOperationException” 抛出异常:mscorlib.dll 中的“System.InvalidOperationException”
我在逻辑中加入了 try/catch 并得到:“从物化 'System.String' 类型到可为空的 'System.DateTime' 类型的指定转换无效。”
现在这不是更多的帮助吗?是的,表格中的字符串和模型中的日期时间都弄乱了。我能说什么?愚蠢的错误。是的,在如何创建索引和为 SQL 查询构建字符串方面还有一些其他错误,但是,我怀疑这绝不是实体框架的错。与跟踪等无关。所有没有兔子的兔子洞。只是简单的日期类型不匹配。
推荐阅读
- c# - 使用 IP 获取远程计算机
- javascript - 我有一个 WIX 网站,我正在尝试使用来自 Authorize.net 的“接受托管”api,但我被困在尝试重定向到付款页面
- encryption - 如何使用机器 ID 加密文件夹
- regex - 如何在同一组中收集不同的表情
- google-maps - 谷歌地图嵌入 API 限制在本地不起作用
- intellij-idea - IntelliJ Idea 2020 格式错误的参数已嵌入引用:-Djava.endorsed.dirs=\"\"
- python - 在 pandas 中迭代地创建多索引和多列数据框
- javascript - VueJS 模板考虑一个真实的 || 虚假陈述为虚假,为什么?
- javascript - Angular2 - 在组件类中创建多个变量声明与直接在模板中使用对象
- reactjs - React Router Dom 5.1.2 — 选项卡支持