2011-07-10 80 views
5

我使用伟大的.NET库AutoPoco来创建测试和种子数据。使用AutoPoco生成依赖于其他值的值

在我的模型中,我有2个日期属性,StartDate和EndDate。

我希望EndDate在开始日期后3小时。

我创建了一个自定义数据源的autopoco低于最低和最高日

class DefaultRandomDateSource : DatasourceBase<DateTime> 
{ 
    private DateTime _MaxDate { get; set; } 
    private DateTime _MinDate { get; set; } 
    private Random _random { get; set; } 


    public DefaultRandomDateSource(DateTime MaxDate, DateTime MinDate) 
    { 
     _MaxDate = MaxDate; 
     _MinDate = MinDate; 

    } 

    public override DateTime Next(IGenerationSession session) 
    { 
     var tspan = _MaxDate - _MinDate; 
     var rndSpan = new TimeSpan(0, _random.Next(0, (int) tspan.TotalMinutes), 0); 


     return _MinDate + rndSpan; 
    } 

} 

之间但在AutoPoco的配置返回一个随机日期时间怎样才能让我的结束日期是说,3个小时后自动生成的开始日期?

这里的autopoco配置

IGenerationSessionFactory factory = AutoPocoContainer.Configure(x => 
      { 
       x.Conventions(c => { c.UseDefaultConventions(); }); 
       x.AddFromAssemblyContainingType<Meeting>(); 
       x.Include<Meeting>() 
        .Setup((c => c.CreatedBy)).Use<FirstNameSource>() 
        .Setup(c => c.StartDate).Use<DefaultRandomDateSource>(DateTime.Parse("21/05/2011"), DateTime.Parse("21/05/2012")); 
      }); 
+0

你想要所有的结束日期是从生成的开始日期后3小时或只是一些随机差异? – TheVillageIdiot

+0

感谢您的回应,理想情况下是最大值和最小值之间的随机差异。 – MrBliz

回答

1

如果我理解正确,你需要的问题:StartDate设置EndDate。我必须创建一个新的DataSource并获取我们正在构建的当前项目并从中读取值。我没有彻底检查,但它可能会失败,如果StartDate设置EndDate后(虽然我认为属性设置的顺序,他们设置,阅读AutoPoco的源代码)。截至今日(2012年2月20日),我还使用最新版本CodePlex

public class MeetingsGenerator 
{ 
    public static IList<Meeting> CreateMeeting(int count) 
    { 
     var factory = AutoPocoContainer.Configure(x => 
     { 
      x.Conventions(c => { c.UseDefaultConventions(); }); 
      x.Include<Meeting>() 
       .Setup((c => c.CreatedBy)).Use<FirstNameSource>() 
       .Setup(c => c.StartDate).Use<DefaultRandomDateSource> 
            (DateTime.Parse("21/May/2012"), 
            DateTime.Parse("21/May/2011")) 
       .Setup(c => c.EndDate).Use<MeetingEndDateSource>(0, 8); 
     }); 
     return factory.CreateSession().List<Meeting>(count).Get(); 
    } 
} 

public class Meeting 
{ 
    public string CreatedBy { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

public class MeetingEndDateSource : DatasourceBase<DateTime> 
{ 
    private int mMin; 
    private int mMax; 
    private Random mRandom = new Random(1337); 

    public MeetingEndDateSource(int min, int max) 
    { 
     mMin = min; 
     mMax = max; 
    } 

    public override DateTime Next(IGenerationContext context) 
    { 
     var node = (TypeGenerationContextNode)((context.Node).Parent); 
     var item = node.Target) as Meeting; 

     if (item == null) 
      return DateTime.Now; 

     return item.StartDate.AddHours(mRandom.Next(mMin, mMax + 1)); 
    } 
} 

class DefaultRandomDateSource : DatasourceBase<DateTime> 
{ 
    private DateTime _MaxDate { get; set; } 
    private DateTime _MinDate { get; set; } 
    private Random _random = new Random(1337); 

    public DefaultRandomDateSource(DateTime MaxDate, DateTime MinDate) 
    { 
     _MaxDate = MaxDate; 
     _MinDate = MinDate; 
    } 

    public override DateTime Next(IGenerationContext context) 
    { 
     var tspan = _MaxDate - _MinDate; 

     var rndSpan = new TimeSpan(0 
            , _random.Next(0, (int)tspan.TotalMinutes) 
            , 0); 

     return _MinDate + rndSpan; 
    } 
} 
+0

谢谢,应该不应该为IgenerationSession的参数,而不是IGenerationContext?我正在使用autopoco 1.0.0.0,通过Nuget – MrBliz

+0

了解以及什么Assembly是TypeGenerationContextNode? – MrBliz

+1

@ Doozer1979我已经提到我已经使用了autopoco.codeplex.com的最新代码,我认为有些事情已经改变了,是的,它之前是'IGenerationSession'。 – TheVillageIdiot