关于我的申请的一些背景知识。我正在开发一个ASP.Net MVC 3 Web App,它使用Entity Framework 4.1进行数据持久化。我的应用程序是分层的,它有一个UI层,服务层,存储库层等。我也使用Unity作为我的控制容器反转。
当用户在我的应用程序上注册时,我使用 StringBuilder 创建两个随机代码(电子邮件和移动验证码)。然后,我将这两个随机代码分配给用户对象中的相应属性,请参阅下文。
User validateUser = new User();
validateUser.firstName = model.firstName.Trim();
validateUser.lastName = model.lastName.Trim();
validateUser.email = model.Email.Trim();
//Create Email and Mobile Verification Codes
string randomEmailCode = "";
randomEmailCode = _notifyService.GenerateEmailCode();
validateUser.emailVerificationCode = randomEmailCode;
string randomMobileCode = "";
randomMobileCode = _notifyService.GenerateMobileCode();
validateUser.mobileVerificationCode = randomMobileCode;
NotifyService
public string GenerateEmailCode()
{
StringBuilder builder = new StringBuilder();
builder.Append(RandomString(4, true));
builder.Append(RandomNumber(1000, 9999));
builder.Append(RandomString(2, false));
return builder.ToString();
}
public string GenerateMobileCode()
{
StringBuilder builder = new StringBuilder();
builder.Append(RandomString(3, true));
builder.Append(RandomNumber(1000, 9999));
builder.Append(RandomString(2, false));
return builder.ToString();
}
private int RandomNumber(int min, int max)
{
Random random = new Random();
return random.Next(min, max);
}
private string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
然后我将用户添加到我的DBcontext并调用SaveChanges()方法将新用户保存到我的数据库中。
_accountService.AddUser(validateUser);
_accountService.Save();
现在,当我进入我的数据库并找到已添加的新用户时, emailVerificationCode 和 mobileVerificationCode 都是相同的。但是,如果我在下一行的代码上加上断点
randomEmailCode = _notifyService.GenerateEmailCode();
跟踪直到保存,然后检查数据库中的新用户, emailVerificationCode 和 mobileVerificationCode 代码是不同的,如预期的那样。
我无法理解为什么当我运行应用程序时,它会为两个属性插入相同的代码。
有人可以帮忙吗?
感谢。
更新
我按照Jane的建议做了,即为每个属性输入硬编码值,如此
validateUser.emailVerificationCode = "emailCode";
validateUser.mobileVerificationCode = "mobileCode";
再次运行应用程序,这次按预期插入了两个硬编码值。这是否意味着我的两种方法 GenerateEmailCode()和 GenerateMobileCode()无法正常工作?
答案 0 :(得分:3)
生成这些随机代码的方式可能有问题。 正如其他人所指出的那样,问题很可能是您在随时间创建随机类的实例。
尝试声明一个静态随机生成器:
static Random r = new Random();
然后使用静态随机生成代码:(以什么方式生成代码显然取决于你,但是这样的东西应该给你一个想法):
public static string generateCode()
{
string chrs = "abcdefghijklmnopqrstuvwxyz";
char[] arr = chrs.ToCharArray();
string code = "";
for (int i = 0; i < 5; i++)
{
code += arr[r.Next(arr.Count())];
}
return code;
}
当我运行时:
var firstCode = generateCode();
var secondCode = generateCode();
我得到2个不同的值。