4

在使用 .net Bogus github 存储库填充数据库时,我想随机填充一个字段,例如:

{“妈妈”、“姐姐”、“哥哥”、“爸爸”、“叔叔”、“侄女”、“侄子”、“堂兄”}

但也随机留下偶尔的空值?

我尝试将它们链接在一起,但似乎没有编译器喜欢的语法。

                .RuleFor(u => u.Gender, f => f.PickRandom<Gender>().ToString())
                .RuleFor(u => u.BirthDate, f => f.Date.PastOffset(60,
                    DateTime.Now.AddYears(-18)).Date.ToShortDateString())
                .RuleFor(u => u.FirstName, (f, u) => f.Name.FirstName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.MiddleName, (f, u) => f.Name.FirstName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.LastName, (f, u) => f.Name.LastName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.Salutation, (f, u) => f.Name.Prefix(ReturnGenderType(u.Gender)))

 private static Bogus.DataSets.Name.Gender ReturnGenderType(string genderString)
        {
            if (genderString == "Male")
            {
                return Bogus.DataSets.Name.Gender.Male;
            }
            else
            {
                return Bogus.DataSets.Name.Gender.Female;
            }
        }

在这个例子中,它看起来可能必须是一个扩展,因为 Gender 类型稍后会反馈给理智但随机的名称。

4

1 回答 1

8

如果您希望Bogus在规则中生成“有时为空”的值,您可以使用方便的.OrNull()扩展方法。以下示例显示以 20% 的概率生成可为空的值:

void Main()
{
   var userFaker = new Faker<User>()
            .RuleFor( u => u.FirstName, f => f.Name.FirstName())
            .RuleFor( u => u.LastName, f => f.Name.LastName().OrNull(f, .2f) );

   userFaker.Generate(10).Dump();
}

public class User{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

您还可以删除ReturnGenderType辅助方法并改用该f => f.Person属性。总结一下,这是您的代码清理的方式:

void Main()
{
   var userFaker = new Faker<User>()
    .RuleFor(u => u.Gender,     f => f.Person.Gender.ToString())
    .RuleFor(u => u.BirthDate,  f => f.Date.PastOffset(60, DateTime.Now.AddYears(-18)).Date.ToShortDateString())
    .RuleFor(u => u.FirstName,  f => f.Person.FirstName)
    .RuleFor(u => u.MiddleName, f => f.Name.FirstName(f.Person.Gender).OrNull(f, .2f))
    .RuleFor(u => u.LastName,   f => f.Person.LastName)
    .RuleFor(u => u.Salutation, f => f.Name.Prefix(f.Person.Gender));

   userFaker.Generate(10).Dump();
}

public class User
{
   public string Gender { get; set; }
   public string BirthDate { get; set; }
   public string FirstName { get; set; }
   public string MiddleName { get; set; }
   public string LastName { get; set; }
   public string Salutation { get; set; }
}

顺便说一句,由生成的称呼f.Name.Prefix(Gender)有时是不正确的,因为性别前缀在en语言环境中没有分开。如果这是一个问题,您可以使用修复您的语言环境的扩展方法进一步扩展Bogus :

public static class MyExtensionsForBogus{
   public static string Prefix2(this Bogus.DataSets.Name name, Gender gender)
   {
      if (gender == Gender.Male)
      {
         return name.Random.ArrayElement(new[] { "Mr.", "Dr." });
      }
      return name.Random.ArrayElement(new[]{"Miss", "Ms.", "Mrs."});
   }
}

然后,新的称呼规则变为:

    .RuleFor(u => u.Salutation, f => f.Name.Prefix2(f.Person.Gender));

现在你得到了一些漂亮的数据:

希望有帮助!=)

于 2019-06-21T06:40:17.167 回答