【问题标题】:Bind custom class to a column in database with EF 4 POCO使用 EF 4 POCO 将自定义类绑定到数据库中的列
【发布时间】:2011-02-26 09:36:52
【问题描述】:

我已经创建了一个类,我们称之为用户。在这个类中,我有一个名为 EMail 的自定义创建类。此类仅包含一个包含电子邮件地址值的字符串和一些用于验证地址的逻辑。所以它在我的 User 类中看起来像这样。

public class User{
 public string Name{get;set;}
 public EMailAddress EMail{get;set;}
 ...
}

我现在想通过使用 EF4 的 CTP5 代码将此电子邮件绑定到我的数据库中的列。但是我不能这样做,我什至没有得到一个好的异常,我得到的只是“线程中止异常”,但是如果我注释掉我的 EMail 属性,它会很好。

我的 EMailAddress 类看起来像这样。

public class EMailAddress
{
    //-- Declaration
    private string _email;

    //-- Constructor
    public EMailAddress(string emailAddress)
    {
        if (emailAddress == null)
            throw new ArgumentNullException(string.Format("Supplied emailaddress can't be null"));
        if (!IsValid(emailAddress))
            throw new ArgumentException(string.Format("'{0}' is not a valid Emailaddress", emailAddress));

       _email = emailAddress;
   }

   //-- Methods
   private static bool IsValid(string emailAddress)
   {
       Regex re = new Regex(Constants.EMAIL_REGULAR_EXPRESSION_PATTERN);
       return re.IsMatch(emailAddress);
   }

   public override string ToString()
   {
       return _email;
   }

   public override bool Equals(object obj)
   {
       if (obj == null)
           return false;

       if (obj is string)
           return _email == (string)obj;

       if(obj is EMailAddress)
           return _email == ((EMailAddress)obj).ToString();

       return false;
   }

   public override int GetHashCode()
   {
       return _email.GetHashCode();
   }

   //-- Operator
   public static bool operator ==(EMailAddress emailAddress, EMailAddress emailAddress2)
   {
       return object.Equals(emailAddress, emailAddress2);
   }

   public static bool operator !=(EMailAddress emailAddress, EMailAddress emailAddress2)
   {
       return !(emailAddress == emailAddress2);
   }
}

而且我想让我的 EMailAddress 类没有任何公共属性。有没有办法让 EF 在将值保存到数据库时使用 .ToString() 方法,并在从数据库加载数据时使用构造函数来填充我的对象。

谢谢...

【问题讨论】:

  • Ladislav 的解决方法是唯一的可能性。或者,您可以切换到 NHibernate,它已支持自定义用户类型多年。

标签: entity-framework poco ef-code-first


【解决方案1】:

不,这是不可能的。你有两个选择:

  • 将另一个字符串属性添加到您的用户类。该属性将负责返回电子邮件和设置电子邮件(创建 EmailAddress 实例)。该属性将被映射。将[NotMappedAttribute] 添加到电子邮件属性。您可以使用新属性的可见性。在常见的 EF 中,您可以更改属性的可见性,但我不确定在代码优先中是否也可以。
  • 将 EMailAddress 映射为复杂类型(用[ComplexTypeAttribute] 标记它,但在这种情况下,您再次需要将字符串属性添加到 EMailAddress。

【讨论】:

  • 由于这是一个旧答案,您知道这是否在 EF6 中得到了改进?我也想将数据库列(文本、数字等)映射到自定义 .NET 类并控制数据的转换方式。我在 NHibernate 中工作过,但我正在为一个新项目调查 EF。
  • @MikeChristensen:恐怕什么都没有改变,因为这个建议还没有结束:data.uservoice.com/forums/…
【解决方案2】:

您可以将非公共属性映射到 EF 中的列,但默认的 codefirst API 不支持开箱即用。我已经提供了一些免费代码,您可以在项目中使用它们来支持这种需求。您仍然必须拥有这些属性,但它们现在可以是受保护的、私有的或内部的。

详情在这里 http://blogs.msdn.com/b/schlepticons/archive/2011/08/31/map-private-properties-with-ef-fluent-api.aspx

【讨论】:

    猜你喜欢
    • 2011-12-31
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多