使用EF 4 POCO将自定义类绑定到数据库中的列

时间:2011-02-26 09:36:53

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

我创建了一个类,我们称之为User。在这个类中,我有一个名为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()方法,并在从数据库加载数据时使用构造函数来填充我的对象。

...谢谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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