2017-12-27 10 views
0

Web Serviceを作成するときにEntity Frameworkを使用しています。 私はEntityクラスを延長しています。DBContextです。モデルをデータベースから更新した後、エンティティコードを変更しないでおく方法

namespace ePdfExtractor.Entity 

public partial class MyDBEntities 
{ 
    public MyDBEntities(): 
      base(GetDecrptString()) 
    { 
    } 
    public static string DecrypConnectionString(string connectionString) 
    { 
     return EncDec.EVODecrypt(connectionString); 
    } 

    public static string EncodeConnectionString(string connectionString) 
    { 
     return EncDec.EVOEncrypt(connectionString); 
    } 

    private static string GetDecrptString() 
    { 
     string connString = ConfigurationManager.ConnectionStrings["MyEntitiesConnection"].ConnectionString; 
     return EncDec.EVODecrypt(connString); 
    } 
} 

たびに私は:

namespace ePdfExtractor.Entity 

public partial class MyDBEntities : DbContext 
{ 
    public MyDBEntities() 
     : base() 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<MyTable1> MyTable1 { get; set; } 
    public virtual DbSet<UserSvc> UserSvcs { get; set; } 
} 

は、これは私のエンティティ別の部分クラスである:私はcontextが作成されるたびに、パスワードの解読を処理するためのロジックを書かれている。このクラスでは

テーブルをクエリする必要があります、私は MyDBEntitiesの新しいインスタンスを作成します:

public partial class UserSvc 
{ 
    public static UserSvc Authenticate(string userName, string password) 
    { 
     using (var ctx = new MyDBEntities()) 
     { 
      UserSvc userObj = ctx.UserSvcs.FirstOrDefault(u => u.UserName == userName && u.Password == password && u.Active); 

      return userObj; 

     } 
    } 
} 

新しいUserSvcテーブルを作成した後にデータベースからモデルを更新すると、このクラスが再生成され、コンストラクタの定義とともに解読ロジックが削除されます。

私はモデルを再生成するたびにこのメソッドを永続化できます。したがって、このクラスは新しいコンテンツでのみ更新されます。それは可能ですか?

+0

[部分クラス](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods)として生成されます。あなたのロジックをそこに移してください。 –

+0

私のプロジェクトでは、部分クラス「MyDBEntities」が1つしか表示されません。 – Yev

+0

右に、生成したくないコードを保持するために別のクラスを追加する必要があります。 https://stackoverflow.com/questions/42160958/how-to-extend-anentity-framework-6-1-3-generated-class –

答えて

0

あなたは部分クラスごとに異なる署名が必要です。新しい署名とそれを呼び出すその後

namespace ePdfExtractor.Entity 

public partial class MyDBEntities 
{ 
    public MyDBEntities(string connectString): 
      base(GetDecrptString(connectString)) 
    { 
    } 

    public static string EVOConnectionString(string connectionString) 
    { 
     return ConfigurationManager.ConnectionStrings["MyEntitiesConnection"].ConnectionString; 
    } 

    public static string DecrypConnectionString(string connectionString) 
    { 
     return EncDec.EVODecrypt(connectionString); 
    } 

    public static string EncodeConnectionString(string connectionString) 
    { 
     return EncDec.EVOEncrypt(connectionString); 
    } 

    private static string GetDecrptString(string connString) 
    { 
     return EncDec.EVODecrypt(connString); 
    } 
} 

を:

using (var ctx = new MyDBEntities(MyDBEntities.EVOConnectionString)) 
{ 
    UserSvc userObj = ctx.UserSvcs.FirstOrDefault(u => u.UserName == userName && u.Password == password && u.Active); 

    return userObj; 

} 

あなたはまた、部分的に強制的にハックを行うことができ:

namespace ePdfExtractor.Entity 

public partial class MyDBEntities 
{ 
    public MyDBEntities(string dummy): 
      base(GetDecrptString()) 
    { 
    } 
    public static string DecrypConnectionString(string connectionString) 
    { 
     return EncDec.EVODecrypt(connectionString); 
    } 

    public static string EncodeConnectionString(string connectionString) 
    { 
     return EncDec.EVOEncrypt(connectionString); 
    } 

    private static string GetDecrptString() 
    { 
     string connString = ConfigurationManager.ConnectionStrings["MyEntitiesConnection"].ConnectionString; 
     return EncDec.EVODecrypt(connString); 
    } 
} 

新しい署名でそれを呼び出します。

using (var ctx = new MyDBEntities("Dummy")) 
{ 
    UserSvc userObj = ctx.UserSvcs.FirstOrDefault(u => u.UserName == userName && u.Password == password && u.Active); 

    return userObj; 

} 
関連する問題