从数据库更新模型后如何保持实体代码不变?

问题描述 投票:0回答:1

我在创建Entity Framework时使用的是Web Service。我有一个扩展EntityDBContext类。

在这个类中,我每次创建context时都编写了一个处理密码解密的逻辑:

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

这是我的实体另一个部分类:

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

每次当我需要查询表时,我都会创建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表后从数据库更新模型时,此类会重新生成,并且我的解密逻辑和构造函数的定义将被删除。

我怎样才能坚持下去,因此,每次重新生成模型时,此类只会更新新内容。这可能吗?

entity-framework dbcontext
1个回答
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;

}
© www.soinside.com 2019 - 2024. All rights reserved.