2011-07-10 26 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