【问题标题】:Custom non-primitive type in Entity Framework code-first 4.1实体框架代码优先 4.1 中的自定义非原始类型
【发布时间】:2011-07-22 18:37:59
【问题描述】:

我有这个自定义类型:

public struct PasswordString
{
    private string value;

    public PasswordString(string value)
    {
        this.value = MD5.CalculateMD5Hash(value);
    }

    public string Value
    {
        get { return this.value; }
        set { this.value = MD5.CalculateMD5Hash(value); }
    }

    public static implicit operator PasswordString(string value)
    {
        return new PasswordString(value);
    }

    public static implicit operator string(PasswordString value)
    {
        return value.Value;
    }

    public static bool operator ==(string x, PasswordString y)
    {
        return x.CompareTo(y) == 0;
    }

    public static bool operator !=(string x, PasswordString y)
    {
        return x.CompareTo(y) != 0;
    }

    public override string ToString()
    {
        return Value;
    }
}

public static class MD5
{
    public static string CalculateMD5Hash(string input)
    {
        System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
        byte[] hash = md5.ComputeHash(inputBytes);

        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
}

所以,我希望你在我的实体框架项目中使用这种类型。如何将类型映射为像字符串一样工作。

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public PasswordString Password { get; set; }
}

使用示例:

User user = new User()
{
    Username = "steve",
    Password = "apple"
};

System.Console.WriteLine(user.Password == "apple");
System.Console.WriteLine(user.Password);

这段代码产生:

True
1F3870BE274F6C49B3E31A0C6728957F

我的目标是查询实体框架以获得这样的结果:

var q = from u in users
        where u.Username == "steve" && u.Password == "apple"
        orderby u.Username
        select u;

那么,我永远不需要加密密码,但它会加密存储在数据库中。

我正在尝试将此类与 EF 一起使用,但没有成功。有没有办法使用 Entity Framework 4.1 实现这一点?

【问题讨论】:

标签: passwords entity-framework-4.1 code-first custom-type


【解决方案1】:

实体框架不支持类型转换器或任何其他方式将简单的数据库列映射到您的自定义类型,甚至还没有计划在下一个版本中使用此类功能。所以你的问题的答案是:不可能。

【讨论】:

    【解决方案2】:

    在 LINQ to Entities 查询中不能将您的类(或结构)用作复杂类型。我命令执行此比较...

    u.Password == "apple"
    

    ...必须调用构造函数,然后依次调用MD5.CalculateMD5Hash。该方法不能翻译成 SQL,查询会抛出异常。很可能 LINQ to Entities 甚至不支持任何重载运算符(如 ==) - 出于同样的原因:EF 无法将其转换为 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多