我正在使用ASP.NET MVC C#构建Web应用程序。 我正在使用函数编写数据:
public string Encode(string encodeMe)
{
byte[] encoded = System.Text.Encoding.UTF8.GetBytes(encodeMe);
return Convert.ToBase64String(encoded);
}
这在类构造函数中调用:
public Booking(string name, string phone, string email, string date)
{
Name = Encode(name);
Phone = Encode(phone);
Email = Encode(email);
PreferredTime = DateTime.Parse(date);
}
到目前为止一切顺利,加密数据被写入数据库。
但是,当我使用此函数读回数据时,我想解码该数据:
public static string Decode(string decodeMe)
{
byte[] encoded = Convert.FromBase64String(decodeMe);
return System.Text.Encoding.UTF8.GetString(encoded);
}
我尝试在Set {}语句中添加这个:
public string Name
{
get
{
return _name;
}
set
{
_name = Decode(value);
}
}
现在会发生什么?预订记录由db.Booking.Add(booking);
中的构造函数正确编码,但在执行db.SaveChanges();
期间调用此Set {}语句,并且未加密的数据被添加到数据库中,但先前加密的数据已正确解码检索显示。尝试解码未加密的数据会导致异常。
答案 0 :(得分:0)
问题是你的属性是不平衡的:它在设置时解码,但它不会在任何地方编码。
另请注意,实体框架使用这些属性就像您一样。因此,EF调用getter,获取_name
,使用_name = Decode(value);
设置。结果:EF从未看到编码值,它只在value
中存在一瞬间。
为了保证属性中的数据始终被编码,您应该保留编码/解码的属性,如果您需要“真实数据”(例如,在显示时),请自行执行。
所以财产就变成了:
public string Name
{
get { return _name; }
set { _name = value; }
}
甚至
public string Name { get; set; }
在Booking
构造函数中,您在分配属性之前已使用Encode()
。
在您需要“实际”值的所有其他地方,您需要使用{{1等等。