覆盖字符串属性问题

时间:2012-09-25 09:53:00

标签: c# asp.net-mvc-3 entity-framework

关于我的申请的一些背景知识。我正在开发一个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()无法正常工作?

1 个答案:

答案 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个不同的值。

here's another helpful link