C# 如何用EntityFramework构建富领域模型

C# 如何用EntityFramework构建富领域模型,c#,.net,entity-framework,orm,C#,.net,Entity Framework,Orm,我使用EntityFramework4.2(代码优先)来创建我的数据库,到目前为止运行良好,但现在我面临一个在Hibernate或JPA中很容易克服的问题,但我无法在这里看到它 我已经定义了一个用户对象,它有一个名为Password的属性,我想自定义{get;set;}操作,以便在设置密码时具有一定的逻辑(我想存储它的哈希版本,但我想在我的域对象ala DDD中使用该逻辑)。但我面临的是,当从数据库中具体化一个对象时,我的setter正在被调用,并且没有直接使用私有字段 我试图构建一个丰富的域对

我使用EntityFramework4.2(代码优先)来创建我的数据库,到目前为止运行良好,但现在我面临一个在Hibernate或JPA中很容易克服的问题,但我无法在这里看到它

我已经定义了一个用户对象,它有一个名为Password的属性,我想自定义{get;set;}操作,以便在设置密码时具有一定的逻辑(我想存储它的哈希版本,但我想在我的域对象ala DDD中使用该逻辑)。但我面临的是,当从数据库中具体化一个对象时,我的setter正在被调用,并且没有直接使用私有字段

我试图构建一个丰富的域对象模型,并在这个模型上避免DAO/Repository模式

这是否可能通过实体框架实现,或者我将被迫使用DAO/存储库模式

下面是我的用户对象的提取:

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条中的链接:(