Entity FrameworkでEffortを使用すると、UpdateモデルによってDbContextからインターフェイスが削除される


質問

現在、私は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;
    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; }
    }
}

だから私は戻って手動で毎回上記の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.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; }
    }
}

それで、すでに上記の部分クラスファイルにあるので、生成されたクラスファイルで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:

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; }    
    }
}

HRModel.Context.cs:HRADDbContextは実際にはデータベースの最初のエンティティですが、同じプロジェクトのコードファーストエンティティである3つの他の* .edmxファイルが存在するため、この例外はHRModel.Context.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; }    
    }
}

IHRADDbContextインターフェイスがEffortに必要なHRADDbContext.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; }    
    }
}




ライセンスを受けた: CC-BY-SA
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ