現在、私はEntity Framework 6ソリューションでEffort( https://effort.codeplex.com/ )を使用して、データベース接続を必要とせずに単体テストを可能にしようとしています( http://www.codeproject.com/Articles/460175を参照) 。 / 2つの戦略 - テスト - エンティティ - フレームワーク - 努力 )。すべてが私のプロジェクトで動作します。これは、インターフェイスを持つDbContext
と、Effortに必要なオーバーロードされたコンストラクタです。
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class HRADDbContext : DbContext, IHRADDbContext
{
public HRADDbContext() : base("name=HRADDbContext")
{
}
public HRADDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
}
public HRADDbContext(DbConnection connection)
: base(connection, true)
{
this.Configuration.LazyLoadingEnabled = false;
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
問題は、「データベースからモデルを更新...」を選択して.edmx
ファイルを更新すると、コンテキストファイルが次のように再生成されることです。
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Common;
using System.Data.Entity;
public partial class HRADDbContext : DbContext
{
public HRADDbContext() : base("name=HRADDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
だから私は戻って手動で毎回上記のContext.cs
ファイルを更新する必要があります。また、 [Key]
をPOCO CCS_DEPT_TBL
ファイルから削除します。
Entity Frameworkプロジェクトをセットアップして、データベースからモデルを更新するたびにインターフェイスとオーバーロードされたコンストラクタを吹き飛ばさないようにする方法はありますか? TIA。
更新:
クラスが部分的なので、インターフェイスとオーバーロードされたコンストラクタが自動生成されない別のファイルに配置されるようにします。
更新2:
元のPOCO
ファイルからDEPTID
取り出して、別のファイルとして追加しましたが、生成されたファイルにそのDEPTID
れているので、同じDEPTID
値に2つのDEPTID
値があるため、クラス:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class CCS_DEPT_TBL
{
[Key]
public string DEPTID { get; set; }
}
}
それで、すでに上記の部分クラスファイルにあるので、生成されたクラスファイルでDEPTID
を生成しないようにするにはどうすればよいですか?
はい、クラスは部分クラスとして定義されています。同じ部分クラスを宣言してそこに追加のメソッドを追加する新しいファイルを作成します。
[Key]属性が失われている場合は、 MetadataType属性を試して使用し、すべてのメタデータをそこに置くことができます。
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CCS_DEPT_TBL_Meta))]
public partial class CCS_DEPT_TBL
{
... Your additional constructors and methods here ...
}
public class CCS_DEPT_TBL_Meta
{
[Key]
public string DEPTID { get; set; }
}
}
ありがとう@ロベルトマッキー!私がやったことがここにあります:
CCS_DEPT_TBL_Key.cs:
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
[MetadataType(typeof(CCS_DEPT_TBL_Meta))]
public partial class CCS_DEPT_TBL
{
}
public class CCS_DEPT_TBL_Meta
{
[Key]
public string DEPTID { get; set; }
}
}
CCS_DEPT_TBL.cs:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Collections.Generic;
public partial class CCS_DEPT_TBL
{
// This table in SQL Server does not have a primary key, it just has an index
public string DEPTID { get; set; }
public string DESCR { get; set; }
public System.DateTime EFFDT { get; set; }
public string EFF_STATUS { get; set; }
public Nullable<System.DateTime> LASTUPDDTTM { get; set; }
}
}
HRModel.Context.cs:HRADDbContextは実際にはデータベースの最初のエンティティですが、同じプロジェクトのコードファーストエンティティである3つの他の* .edmxファイルが存在するため、この例外はHRModel.Context.csでコメントアウトされています。適用する。おそらく、データベースの最初のエンティティを別のプロジェクトに分けて、この例外がデータベースモデルの更新で生成されないようにする方がよいでしょう。
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public partial class HRADDbContext : DbContext
{
public HRADDbContext()
: base("name=HRADDbContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//throw new UnintentionalCodeFirstException();
}
public virtual DbSet<CCS_DEPT_TBL> CCS_DEPT_TBL { get; set; }
public virtual DbSet<CCS_HR_AD_SYNC> CCS_HR_AD_SYNC { get; set; }
}
}
IHRADDbContextインターフェイスがEffortに必要なHRADDbContext.cs:
using System;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace Cssd.IT.PortalIntegration.DataAccess.HR.Dao
{
/// <summary>
/// Added interface here so that it does not get removed when updating
/// model from the database on code generation.
/// </summary>
partial class HRADDbContext : IHRADDbContext
{
public HRADDbContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
this.Configuration.LazyLoadingEnabled = false;
}
public HRADDbContext(DbConnection connection)
: base(connection, true)
{
this.Configuration.LazyLoadingEnabled = false;
}
}
}