Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 6和Oracle使用Guid作为主键_C#_Oracle_Entity Framework_Ef Code First - Fatal编程技术网

C# EF 6和Oracle使用Guid作为主键

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

在我们的应用程序(ASP.NET MVC 5)中,我们首先在SQL Server中使用EF 6代码。现在我们需要使用Oracle数据库(我们的客户不信任SQL Server)来运行它

我们已经设法让一个小测试项目正常工作,但是在迁移实际应用程序时遇到了一些问题

我们还不能解决的一个问题是使用
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:标识空间不允许使用数字签名类型aufweisen
ORA-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>