バックグラウンド
ef4.1を使用して最初のモデルをコーディングします。データベースはOracleであるため、DevartdotConnectも使用しています。
問題
アプリをサーバーにデプロイした後、SQLステートメントと無効な列名でエラーが発生しました。私の開発用PCではすべてが正常に機能しました。
小さなテストコンソールアプリを作成し、動作を複製しました。私のPCでは、デバッグではなく、アプリを実行するだけで、正常に動作し、データを正しく選択します。サーバーでは、selectステートメントに外部キー用の2つの追加の列名があります。
実在物
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.ServiceModel.DomainServices.Server;
using log4net;
namespace Cul2.Model
{
[Table("LAB_REQUISITION")]
public class LabRequisition : EntityBase
{
public LabRequisition()
{
Attributes = new Collection<LabRequisitionAttribute>();
Samples = new Collection<LabSample>();
}
[Key]
[Column("REQUISITION_ID")]
public long? RequisitionId { get; set; }
[Column("MATERIAL_ID")]
public long? MaterialId { get; set; }
[Include]
[Association("Material", "MaterialId", "MaterialId", IsForeignKey = true)]
public virtual LabMaterial Material { get; set; }
[Column("LAB_NUMBER")]
public int? LabNumber { get; set; }
[Column("COLLECTOR_ID")]
public long? CollectorId { get; set; }
[Include]
[Association("Collector", "CollectorId", "UserId")]
[ForeignKey("CollectorId")]
public virtual ComUser Collector { get; set; }
[Column("RECEIVER_ID")]
public long? ReceiverId { get; set; }
[Include]
[Association("Receiver", "ReceiverId", "UserId")]
[ForeignKey("ReceiverId")]
public virtual ComUser Receiver { get; set; }
[Column("COLLECTION_DATE")]
public DateTime? CollectionDate { get; set; }
[Column("STATUS_ID")]
public long? StatusId { get; set; }
[Include]
[Association("Status", "StatusId", "StatusId", IsForeignKey = true)]
public virtual LabStatus Status { get; set; }
[Column("IS_ACTIVE")]
public bool IsActive { get; set; }
[Column("TEMPLATE_ID")]
public long? TemplateId { get; set; }
[Include]
[Association("Template", "TemplateId", "TemplateId", IsForeignKey = true)]
public virtual LabTemplate Template { get; set; }
[Column("REASON_ID")]
public long? ReasonId { get; set; }
[Include]
[Association("Reason", "ReasonId", "ReasonId", IsForeignKey = true)]
public virtual LabReason Reason { get; set; }
[Column("RECEIVED_DATE")]
public DateTime? ReceivedDate { get; set; }
[Include]
[Association("Samples", "RequisitionId", "RequisitionId")]
[ForeignKey("RequisitionId")]
public ICollection<LabSample> Samples { get; set; }
[Include]
[Association("Attributes", "RequisitionId", "RequisitionId")]
public ICollection<LabRequisitionAttribute> Attributes { get; set; }
public override string ToString()
{
return LabNumber == null ? "New" : LabNumber.ToString();
}
}
}
私のPCでは、これはそのエンティティ用に生成されたスキーマSQLです。
-- Table LAB_REQUISITION
CREATE TABLE LAB_REQUISITION (
REQUISITION_ID NUMBER(18) NOT NULL,
MATERIAL_ID NUMBER(18) NULL,
LAB_NUMBER NUMBER(10) NULL,
COLLECTOR_ID NUMBER(18) NULL,
RECEIVER_ID NUMBER(18) NULL,
COLLECTION_DATE TIMESTAMP(7) NULL,
STATUS_ID NUMBER(18) NULL,
IS_ACTIVE NUMBER(1) NOT NULL,
TEMPLATE_ID NUMBER(18) NULL,
REASON_ID NUMBER(18) NULL,
RECEIVED_DATE TIMESTAMP(7) NULL,
ROW_VERSION NUMBER(18,2) NULL,
CREATED TIMESTAMP(7) NULL,
CREATED_BY_ID NUMBER(18) NULL,
LAST_UPDATED TIMESTAMP(7) NULL,
LAST_UPDATED_BY_ID NUMBER(18) NULL,
PRIMARY KEY (REQUISITION_ID)
)
/
サーバー上で、これは生成されたスキーマです。
-- Table LAB_REQUISITION
CREATE TABLE LAB_REQUISITION (
REQUISITION_ID NUMBER(18) NOT NULL,
MATERIAL_ID NUMBER(18) NULL,
LAB_NUMBER NUMBER(10) NULL,
COLLECTOR_ID NUMBER(18) NULL,
RECEIVER_ID NUMBER(18) NULL,
COLLECTION_DATE TIMESTAMP(7) NULL,
STATUS_ID NUMBER(18) NULL,
IS_ACTIVE NUMBER(1) NOT NULL,
TEMPLATE_ID NUMBER(18) NULL,
REASON_ID NUMBER(18) NULL,
RECEIVED_DATE TIMESTAMP(7) NULL,
ROW_VERSION NUMBER(18,2) NULL,
CREATED TIMESTAMP(7) NULL,
CREATED_BY_ID NUMBER(18) NULL,
LAST_UPDATED TIMESTAMP(7) NULL,
LAST_UPDATED_BY_ID NUMBER(18) NULL,
"Collector_UserId" NUMBER(18) NULL,
"Receiver_UserId" NUMBER(18) NULL,
PRIMARY KEY (REQUISITION_ID)
)
/
Collector_UserId列とReceiver_UserId列が正しくなく、SQL選択エラーが発生しています。
モデルがDevPCで正しいSQLを生成する理由を理解できませんが、サーバーでは偽の余分な列が生成されます。
アプリはDevPCとサーバーでまったく同じですが、サーバーではDbProviderFactoriesセクションをapp.configに追加する必要がありました。私のPCでは、Devartがインストールされているので、すでに登録されていると思います。それ以外はまったく同じです。
私のDevPCでは、DevartライブラリはGACからロードされていますが、サーバーでは、binフォルダーからロードされています。私が知る限り、バージョンは同じです。
アップデート1-バージョン:
これらは、EFアセンブリとdevartアセンブリのバージョンとパスです。
サーバ
アセンブリ:EntityFramework EntityFramework、Version = 4.1.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 file:/// C:/apps/Cultivate.TestConsole/EntityFramework.DLL
アセンブリ:Devart.Data.Oracle.Entity Devart.Data.Oracle.Entity、Version = 7.2.96.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/apps/Cultivate.TestConsole/Devart.Data.Oracle。 Entity.DLL
アセンブリ:Devart.Data.Oracle Devart.Data.Oracle、Version = 7.2.96.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/apps/Cultivate.TestConsole/Devart.Data.Oracle.DLL
アセンブリ:Devart.Data Devart.Data、Version = 5.0.555.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/apps/Cultivate.TestConsole/Devart.Data.DLL
DEV PC
アセンブリ:EntityFramework EntityFramework、Version = 4.1.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089 file:/// C:/dev/tfs/cul2/source/Cul2.Actions.Lab.TestConsole/bin/Debug/EntityFramework.DLL
アセンブリ:Devart.Data.Oracle.Entity Devart.Data.Oracle.Entity、Version = 7.2.96.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/Windows/Microsoft.Net/assembly/GAC_MSIL/Devart。 Data.Oracle.Entity / v4.0_7.2.96.0__09af7300eec23701 / Devart.Data.Oracle.Entity.dll
アセンブリ:Devart.Data.Oracle Devart.Data.Oracle、Version = 7.2.96.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/Windows/assembly/GAC_MSIL/Devart.Data.Oracle/7.2.96.0__09af7300eec23701 /Devart.Data.Oracle.dll
アセンブリ:Devart.Data Devart.Data、Version = 5.0.555.0、Culture = neutral、PublicKeyToken = 09af7300eec23701 file:/// C:/Windows/assembly/GAC_MSIL/Devart.Data/5.0.555.0__09af7300eec23701/Devart.Data.dll