2011-07-10 28 views
5

Tôi đang sử dụng thư viện .NET tuyệt vời AutoPoco để tạo thử nghiệm và Dữ liệu hạt giống.Tạo một giá trị phụ thuộc vào giá trị khác với AutoPoco

Trong mô hình của tôi, tôi có 2 thuộc tính ngày, StartDate và EndDate.

Tôi muốn ngày kết thúc là 3 giờ sau ngày bắt đầu.

tôi đã tạo ra một nguồn tùy chỉnh dữ liệu cho autopoco dưới đây mà trả về một Datetime ngẫu nhiên giữa một phút và ngày tối đa

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; 
    } 

} 

Nhưng trong cấu hình AutoPoco của làm thế nào tôi có thể nhận được EndDate tôi để được nói, 3 giờ sau khi ngày bắt đầu tự động?

Đây là autopoco cấu hình

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

bạn có muốn tất cả ngày kết thúc sau 3 giờ kể từ ngày bắt đầu được tạo hoặc chỉ một số khác biệt ngẫu nhiên? – TheVillageIdiot

+0

Cảm ơn phản hồi, Lý tưởng là sự khác biệt ngẫu nhiên giữa giá trị cực đại và cực đại. – MrBliz

Trả lời

1

Nếu tôi hiểu đúng vấn đề bạn cần: thiết EndDate từ StartDate. Tôi đã phải tạo một DataSource mới và nhận mục hiện tại mà chúng tôi đang xây dựng và đọc giá trị từ nó. Tôi đã không kiểm tra kỹ lưỡng nhưng nó có thể thất bại nếu StartDate được thiết lập sau EndDate (mặc dù tôi nghĩ rằng các thuộc tính được thiết lập theo thứ tự chúng được thiết lập, đọc mã nguồn cho AutoPoco). Ngoài ra tôi đang sử dụng phiên bản mới nhất từ ​​CodePlex tính đến hôm nay (ngày 20 tháng 2 năm 2012).

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

Cảm ơn, không nên tham số cho Tiếp theo phải là IgenerationSession chứ không phải IGenerationContext? Tôi đang sử dụng autopoco 1.0.0.0, isntalled qua Nuget – MrBliz

+0

Và Assembly nào là TypeGenerationContextNode? – MrBliz

+1

@ Doozer1979 Tôi đã đề cập rằng tôi đã sử dụng mã mới nhất từ ​​autopoco.codeplex.com và tôi nghĩ rằng một cái gì đó đã thay đổi, có nó đã được 'IGenerationSession' trước đó. – TheVillageIdiot

Các vấn đề liên quan