实体框架6 - SQL Server和Oracle(SaveChanges)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架6 - SQL Server和Oracle(SaveChanges)相关的知识,希望对你有一定的参考价值。
我有一个应用程序,它使用以下(Employee)域模型的SQL Server和Oracle数据提供程序。此模型适用于Oracle数据提供程序,但同样会给SQL Server带来错误。当我将字段“ID”从十进制更改为Int时,它适用于SQL Server但在Oracle中出错。
在应用程序配置上,我正在将数据提供程序从SQL Server更改为Oracle,反之亦然。
当IDENTITY_INSERT设置为OFF时,无法在表'Employee'中为identity列插入显式值。*
ORA-01400:无法插入NULL(“Emp”。“Employee”。“ID”)
public class Employee
{
[Key, Column(Order = 0)]
public decimal ID { get; set; }
public string NAME { get; set; }
}
if (ID == null || ID == 0)
{
Model.Employee obj = new Model.Employee();
obj.NAME = Name;
if (Convert.ToInt32(ConfigurationSettings.AppSettings["DataProviderType"]) == "Oracle")
obj.ID = GetNextId();
DbContext.Employees.Add(obj);
DbContext.SaveChanges();
}
SQL Server表脚本
CREATE TABLE [dbo].[Employee](
[ID] [int] IDENTITY(1,1) NOT NULL,
[NAME] [varchar](256) NULL,
CONSTRAINT [Employee_PK] PRIMARY KEY CLUSTERED
(
[ID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Oracle表脚本
CREATE TABLE Employee
(
"ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(256)
);
CREATE UNIQUE INDEX "PK_Employee" ON "Employee" ("ID");
ALTER TABLE "Employee" ADD CONSTRAINT "Employee_PK" PRIMARY KEY ("ID") ENABLE;
如何在我的应用程序中处理此问题,即在DOTNET端?
答案
根据@IvanStoev的建议,我将数据类型从int更改为数字IDENTITY(1,1)NOT NULL。在sql server中。并使用以下代码处理IDENTITY_INSERT错误,
modelBuilder.Entity<Employee>().Property(i => i.ID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
希望这能帮助有类似问题的人。
以上是关于实体框架6 - SQL Server和Oracle(SaveChanges)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用实体框架在 Sql Server Express 中获取下一个序列号?