我正在使用Entity Framework 4.2(Code First)来创建我的数据库,到目前为止工作正常,但现在我面临的一个问题很容易在Hibernate或JPA中克服,但我不能在这里看到它。
我已经定义了一个User对象,它有一个名为Password的属性,我想自定义{get; set;}操作,以便在设置密码时有一定的逻辑(我想存储它的哈希版本,但是我想在我的域对象ala DDD中使用该逻辑。但我面临的是,当从数据库中实现一个对象时,我的setter被调用,而不是直接使用私有字段。
我正在尝试构建一个Rich Domain Object模型并避免使用DAO / Repository模式。
这是否可能通过实体框架,或者我将强制使用DAO /存储库模式。
下面是我的User对象的提取:
public class User
{
[Key]
public string LoginId { get; set; }
[Required]
private string password;
public string Password
{
get { return password; }
set {
//Random Salt
byte[] s;
using (RNGCryptoServiceProvider prov = new RNGCryptoServiceProvider())
{
s = new byte[20];
prov.GetBytes(s);
}
this.salt = Convert.ToBase64String(s);
//Random salt
password = ComputeHash(value);
}
}
[Required]
private string salt;
public string Salt {
get { return this.salt; }
set { throw new InvalidOperationException("Salt is not an assignable property. Assign a password first to your model and a Salt will get created."); }
}
public bool ValidatePassword(string clearTextPassword)
{
return this.Password == this.ComputeHash(clearTextPassword);
}
public string ComputeHash(string value)
{
...
return hashVersion of value;
}
}
答案 0 :(得分:0)
首先添加加密的passwordstring值对象(不可变)
例如
public class EncryptedString
{
public string Value { get;private set; }
public string Hash { get;private set; }
bool Validate(string password);
public Encrypted(string value)
{
// Put logic here
}
}
在EF中,它被称为复杂类型