C#DB2 EF Insert erorr

C#DB2 EF Insert erorr,c#,entity-framework,db2,C#,Entity Framework,Db2,我目前在向表中插入新行时遇到一些问题。问题很可能是,无论出于何种原因,语句的主键周围都有双引号 select "OID" as ""OID"" from new table (insert into "PAQ"."TPAQ100_AUFTRAG"("EKVNR", "AUFTRAG_ERSTELLT_AM", "NACHNAME", "VORNAME", "GEBURTSDATUM", "SACHBEARBEITER_NACHNAME", "SACHBEARBEITER_VORNAME", "

我目前在向表中插入新行时遇到一些问题。问题很可能是,无论出于何种原因,语句的主键周围都有双引号

select "OID" as ""OID"" 
from new table (insert into "PAQ"."TPAQ100_AUFTRAG"("EKVNR", "AUFTRAG_ERSTELLT_AM", "NACHNAME", "VORNAME", "GEBURTSDATUM", "SACHBEARBEITER_NACHNAME", "SACHBEARBEITER_VORNAME", "SACHBEARBEITER_USER", "DIENSTSTELLE", "LEI_ARZT_ANGEFORDERT", "LEI_ZAHNARZT_ANGEFORDERT", "LEI_APO_ANGEFORDERT", "LEI_KH_ANGEFORDERT", "LEI_SONSTIGE_LE_ANGEFORDERT", "GUELTIG_VON", "GUELTIG_BIS", "AUSGABEWEG", "AUFTRAG_HERKUNFT")
    values (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17))
现在我已经在false上启用了
EnableEFCaseSensitivity
,老实说,我不知道这些引用是从哪里来的。我确实使用了
属性,但不用于
OID
。我只设置了
属性,就这样。列(以及表的名称)都是大写的

错误是:

错误[42601][IBM][DB2/AIX64]SQL0104N在“选择”OID“as”之后发现意外标记“”。预期的令牌可能包括:“”

模型类:

    [Table("PAQ.TPAQ100_AUFTRAG")]
    public class Auftrag
    {
        [Key]
        public long OID { get; set; }

        [Required]
        [StringLength(10)]
        [Column("EKVNR")]
        public string Ekvnr { get; set; }

        [Column("AUFTRAG_ERSTELLT_AM")]
        public DateTime CreatedAt { get; set; }

        [Required]
        [StringLength(60)]
        [Column("NACHNAME")]
        public string Nachname { get; set; }

        [Required]
        [StringLength(30)]
        [Column("VORNAME")]
        public string Vorname { get; set; }

        [Column("GEBURTSDATUM", TypeName = "date")]
        public DateTime GebDat { get; set; }

        [StringLength(32)]
        [Column("SACHBEARBEITER_NACHNAME")]
        public string SachbearbeiterNachname { get; set; }

        [StringLength(32)]
        [Column("SACHBEARBEITER_VORNAME")]
        public string SachbearbeiterVorname { get; set; }

        [StringLength(20)]
        [Column("SACHBEARBEITER_USER")]
        public string SachbearbeiterUser { get; set; }

        [StringLength(7)]
        [Column("DIENSTSTELLE")]
        public string SachbearbeiterDst { get; set; }

        [Column("LEI_ARZT_ANGEFORDERT")]
        public short AerztlicheLeistungen { get; set; }

        [Column("LEI_ZAHNARZT_ANGEFORDERT")]
        public short ZahnaerztlicheLeistungen { get; set; }

        [Column("LEI_APO_ANGEFORDERT")]
        public short Arzneimittel { get; set; }

        [Column("LEI_KH_ANGEFORDERT")]
        public short KrankenhausBehandlung { get; set; }


        [Column("LEI_SONSTIGE_LE_ANGEFORDERT")]
        public short SonstigeLeistungen { get; set; }

        [Column("GUELTIG_VON", TypeName = "date")]
        public DateTime GueltigAb { get; set; }

        [Column("GUELTIG_BIS", TypeName = "date")]
        public DateTime GueltigBis { get; set; }

        [Required]
        [StringLength(1)]
        [Column("AUSGABEWEG", TypeName = "character")]
        public string AusgabeWeg { get; set; }

        [Required]
        [StringLength(1)]
        [Column("AUFTRAG_HERKUNFT", TypeName = "character")]
        public string AuftragHerkunft { get; set; }
    }
存储库功能:

public void Create(Auftrag auftrag)
{
    Logger.LogInfo($"Versuche den Auftrag für Versicherten {auftrag.Nachname}, {auftrag.Vorname} in die Auftragsdatenbank zu schreiben");
    auftrag.CreatedAt = DateTime.Now;

    _context.Auftraege.Add(auftrag);
    //Loggt die Query zwecks Fehleranalyse
    _context.Database.Log = Logger.LogInfo;
    _context.SaveChanges();
}
上下文类:

public partial class AuftragDbContext : DbContext
    {
        public AuftragDbContext(DbConnection db2Connection)
            : base(db2Connection, true)
        {
        }

        public DbSet<Auftrag> Auftraege { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Ekvnr)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Nachname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.Vorname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterNachname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterVorname)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterUser)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.SachbearbeiterDst)
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.AuftragHerkunft)
                .IsFixedLength()
                .IsUnicode(false);

            modelBuilder.Entity<Auftrag>()
                .Property(e => e.AusgabeWeg)
                .IsFixedLength()
                .IsUnicode(false);
        }

        /// <summary>
        /// Dient dem Abfangen von Exceptions im Prozess des Sicherns der datenbankseitigen Operationen
        /// </summary>
        /// <returns></returns>
        public override int SaveChanges()
        {
            try
            {
                return base.SaveChanges();
            }
            catch (DbEntityValidationException dbValEx)
            {
                var values = dbValEx.EntityValidationErrors;
                if (values == null) throw new ArgumentNullException(nameof(values));
                throw;
            }
            catch (DbUpdateException dbUpEx)
            {
                throw dbUpEx;
            }
        }
    }
    /// <summary>
    /// Gibt die Datenbankconnection abhängig von der aktuellen Domäne zurück
    /// </summary>
    public static class AuftragContextFactory
    {
        private static string _connectionString = null;

        private static DB2Connection GetConnectionString()
        {
            if (_connectionString != null)
            {
                return new DB2Connection(_connectionString);
            }

            var connstrBulder = new DakampClientConnectionStringBuilder(EnvironmentHandler.Environment);
            var connStr = connstrBulder.GetClientConnectionString(DatabaseType.AuftragsDB);
            var db2ConStrBldr = new DB2ConnectionStringBuilder(connStr)
            {
                //Queries laufen so lange, bis sie durch sind unabhängig vom CommandTimeout
                QueryTimeout = 0,
                EnableEFCaseSensitivity = false,
                ConcurrentAccessResolution = "CurrentlyCommitted",
            };
            _connectionString = db2ConStrBldr.ConnectionString;
            return new DB2Connection(_connectionString);
        }

        public static AuftragDbContext AuftragDb => new AuftragDbContext(GetConnectionString());
    }
公共部分类AuftragDbContext:DbContext
{
公共AuftragDbContext(数据库连接db2Connection)
:base(db2Connection,true)
{
}
公共数据库集Auftraege{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(e=>e.Ekvnr)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.Nachname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.Vorname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterNachname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterVorname)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.sachbearbeinteruser)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.SachbearbeiterDst)
.IsUnicode(假);
modelBuilder.Entity()
.Property(e=>e.AuftragHerkunft)
.IsFixedLength()
.IsUnicode(假);
modelBuilder.Entity()
.属性(e=>e.Ausgabeeg)
.IsFixedLength()
.IsUnicode(假);
}
/// 
///目前,银行运营项目中存在例外情况
/// 
/// 
公共覆盖int SaveChanges()
{
尝试
{
返回base.SaveChanges();
}
捕获(DbEntityValidationException dbValEx)
{
var values=dbValEx.EntityValidationErrors;
如果(values==null)抛出新的ArgumentNullException(nameof(values));
投掷;
}
catch(DbUpdateException dbUpEx)
{
抛出dbUpEx;
}
}
}
/// 
///这是一个很好的例子
/// 
公共静态类AuftragContextFactory
{
私有静态字符串_connectionString=null;
私有静态DB2Connection GetConnectionString()
{
if(_connectionString!=null)
{
返回新的DB2Connection(_connectionString);
}
var connstrBulder=new DakampClientConnectionStringBuilder(EnvironmentHandler.Environment);
var connStr=connstrBulder.GetClientConnectionString(DatabaseType.AuftragsDB);
var db2ConStrBldr=新的DB2ConnectionStringBuilder(connStr)
{
//劳芬·索兰格(laufen so lange)的问题,请您回答
QueryTimeout=0,
EnableEFCaseSensitivity=false,
ConcurrentAccessResolution=“CurrentlyCommitted”,
};
_connectionString=db2ConStrBldr.connectionString;
返回新的DB2Connection(_connectionString);
}
公共静态AuftragDbContext AuftragDb=>newauftragdbContext(GetConnectionString());
}

在过去的几个小时里,我一直在搜索一个解决方案,但没有找到任何有用的解决方案。

尽管这不是一个100%令人满意的答案,但您可以使用命令拦截器修改sql查询,然后再执行查询:

public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
    command.CommandText = command.CommandText.Replace("\"\"", "\"").Trim();
    Logger.LogInfo("ReaderExecuted: " +
                   $" IsAsync: {interceptionContext.IsAsync}, Command Text: {command.CommandText}");
}
public void reader执行(DbCommand命令,DbCommandInterceptionContext interceptionContext)
{
command.CommandText=command.CommandText.Replace(“\”\”,“\”).Trim();
Logger.LogInfo(“ReaderExecuted:”+
$“IsAsync:{interceptOnContext.IsAsync},命令文本:{Command.CommandText}”);
}

我所做的只是用一个引号替换双引号,它工作正常。

我假设这是由Entity Framework生成的语句?如果是,是哪个版本?这也引出了一个问题:如果使用
属性怎么办?它是EF 6.1.3,我尝试使用列属性作为键(OID),但没有任何更改。恐怕这是DB2数据提供程序中的一个奇怪错误。您可能会在他们的产品站点上提出问题。同时,您可以通过从a中的查询字符串中删除双引号来解决此问题。您可以继承自
DbCommandInterceptor
,并重写相应的方法来修改命令的文本。