实体框架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 中获取下一个序列号?

实体框架 6.0 和 oracle 11

实体框架和 SQL Server 视图

java实体属性对应mysql和SQL Server 和Oracle 数据类型对应

SQL Server 和实体框架性能改进

实体框架和 SQL Server Express 瓶颈