C# EF 6和Oracle使用Guid作为主键
在我们的应用程序(ASP.NET MVC 5)中,我们首先在SQL Server中使用EF 6代码。现在我们需要使用Oracle数据库(我们的客户不信任SQL Server)来运行它 我们已经设法让一个小测试项目正常工作,但是在迁移实际应用程序时遇到了一些问题 我们还不能解决的一个问题是使用C# EF 6和Oracle使用Guid作为主键,c#,oracle,entity-framework,ef-code-first,C#,Oracle,Entity Framework,Ef Code First,在我们的应用程序(ASP.NET MVC 5)中,我们首先在SQL Server中使用EF 6代码。现在我们需要使用Oracle数据库(我们的客户不信任SQL Server)来运行它 我们已经设法让一个小测试项目正常工作,但是在迁移实际应用程序时遇到了一些问题 我们还不能解决的一个问题是使用Guid作为主键(我们所有的类都有Guid作为主键) 比如: public class TestModel { [Key] [DatabaseGenerated(DatabaseGenerat
Guid
作为主键(我们所有的类都有Guid
作为主键)
比如:
public class TestModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TestModelId { get; set; }
}
如果我们使用上面的代码运行updatedatabase
,我们会得到以下异常:
标识Spalte muss einen numerischen Typ aufweisen=标识列必须是数字类型
Oracle.ManagedDataAccess.Client.OracleException(0x000077D3):ORA-30675:标识空间不允许使用数字签名类型aufweisenORA-30675:数字的身份信息 我们试图通过告诉Oracle/EF将字段设置为原始(16),来解决这个问题: 这将生成一个如下所示的表:
+----------------------------------+
| Name | DataType | NotNull |
+----------------------------------+
| TestModelId | RAW(16) | True |
+----------------------------------+
但是如果没有数据库生成属性
,我们必须手动为我们的模型提供主键。。。这是我们不想做的
如何使用Oracle数据库将Guid
作为主键与DatabaseGenerated(DatabaseGeneratedOption.Identity)
一起使用
我们正在使用:
- 环境足迹6.1.1
- Oracle.ManagedDataAccess 4.121.1.0(ODAC 12c第3版)
- Oracle.ManagedDataAccess.EntityFramework 6.121.1.0(ODAC 12c第3版)
web.config
):
我也有类似的问题,并尝试使用Adriano Repetti的建议,即在构造函数中添加“Guid.NewGuid()”。它工作得很好 我认为使用EF不能将GUID作为数据库生成的ID(AFAIK!),在代码中,首先在类构造函数中添加GUID.NewGuid()。使用SQL Server GUID作为数据库生成的ID可以完美地工作。。这是Oracle的限制吗?是的-Oracle(和许多其他数据库)没有Guid
数据类型;还有一个很好的理由不使用Guid
(Uniqueidentifier
)作为SQL Server中的主键!这应该是一个评论
public class TestModel
{
[Key]
//[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid TestModelId { get; set; }
}
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Entity<TestModel>()
.ToTable("TESTMODEL", " MySchema");
/*modelBuilder.Entity<TestModel>()
.Property( x => x.TestModelId )
.HasColumnType( "RAW(16)" );*/
}
+----------------------------------+
| Name | DataType | NotNull |
+----------------------------------+
| TestModelId | RAW(16) | True |
+----------------------------------+
<configuration>
<configSections>
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
requirePermission="false" />
</configSections>
<connectionStrings>
<add name="Model1" connectionString="DATA SOURCE=ORCL;PASSWORD=PASSWORD;PERSIST SECURITY INFO=True;USER ID=USER"
providerName="Oracle.ManagedDataAccess.Client" />
</connectionStrings>
<entityFramework>
<providers>
<provider invariantName="Oracle.ManagedDataAccess.Client"
type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="Oracle Data Provider for .NET" description="Oracle Data Provider for .NET"
invariant="Oracle.ManagedDataAccess.Client"
type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
</configuration>