C# 如何用EntityFramework构建富领域模型
我使用EntityFramework4.2(代码优先)来创建我的数据库,到目前为止运行良好,但现在我面临一个在Hibernate或JPA中很容易克服的问题,但我无法在这里看到它 我已经定义了一个用户对象,它有一个名为Password的属性,我想自定义{get;set;}操作,以便在设置密码时具有一定的逻辑(我想存储它的哈希版本,但我想在我的域对象ala DDD中使用该逻辑)。但我面临的是,当从数据库中具体化一个对象时,我的setter正在被调用,并且没有直接使用私有字段 我试图构建一个丰富的域对象模型,并在这个模型上避免DAO/Repository模式 这是否可能通过实体框架实现,或者我将被迫使用DAO/存储库模式 下面是我的用户对象的提取:C# 如何用EntityFramework构建富领域模型,c#,.net,entity-framework,orm,C#,.net,Entity Framework,Orm,我使用EntityFramework4.2(代码优先)来创建我的数据库,到目前为止运行良好,但现在我面临一个在Hibernate或JPA中很容易克服的问题,但我无法在这里看到它 我已经定义了一个用户对象,它有一个名为Password的属性,我想自定义{get;set;}操作,以便在设置密码时具有一定的逻辑(我想存储它的哈希版本,但我想在我的域对象ala DDD中使用该逻辑)。但我面临的是,当从数据库中具体化一个对象时,我的setter正在被调用,并且没有直接使用私有字段 我试图构建一个丰富的域对
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;
}
}首先添加加密的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中,它被称为复杂类型,首先添加一个加密的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中,它被称为复杂类型,我忍不住想说这句话作为答案:
要构建一个丰富的DM,首先需要一个丰富的域。如果你能做到这一点,你将在你所做的一切中获得成功
谢谢你的思考,我只是举了一个非常简短的例子,或者可能我只是使用了错误的措辞(rich DM),但把它放在一边,回到原来的问题。在EntityFramework中,是否可以自定义{get;set;}并让EntityFramework直接将其逻辑映射到私有字段,而不调用公共属性?我发现了以下内容:(如何在“getter”或“setter”后面编写自定义逻辑?)但文章404中的链接:(我忍不住想说这句话作为答案:要构建一个丰富的DM,首先需要一个丰富的域。获得这一点,你将在你所做的一切中获得成功
谢谢你的想法,我只是举了一个很短的例子,也许我只是使用了错误的措辞(丰富的DM),但把它放在一边,回到原来的问题。在EntityFramework中是否可以自定义{get;set;}并让EntityFramework直接将它们的逻辑映射到私有字段而不调用公共属性?我发现了以下内容:(如何在“getter”或“setter”后面编写自定义逻辑?)但第404条中的链接:(