【发布时间】: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