2011-07-10 5 views
5

Estoy usando la gran biblioteca .NET AutoPoco para crear datos de prueba y semilla.Generando un valor dependiente de otro valor con AutoPoco

En mi modelo tengo 2 propiedades de fecha, StartDate y EndDate.

Quiero que el EndDate sea 3 horas después de la Fecha de inicio.

He creado una fuente de datos personalizado para autopoco a continuación que devuelve una fecha y hora aleatoria entre un minuto y la fecha máxima

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

} 

Pero en la configuración del AutoPoco ¿Cómo puedo obtener mi EndDate sea decir, 3 horas después la fecha de inicio autogenerado?

Aquí está la configuración 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

¿Desea que todas las fechas de finalización sean después de 3 horas de las fechas de inicio generadas o solo una diferencia aleatoria? – TheVillageIdiot

+0

Gracias por la respuesta, idealmente una diferencia aleatoria entre un valor máximo y mínimo. – MrBliz

Respuesta

1

Si estoy entendiendo correctamente el problema que necesita: para establecer EndDate de StartDate. Tuve que crear un nuevo DataSource y obtener el elemento actual que estamos construyendo y leer su valor. No lo he comprobado completamente, pero podría fallar si StartDate está configurado después de EndDate (aunque creo que las propiedades están configuradas en el orden en que están configuradas, lea el código fuente de AutoPoco). También estoy usando la última versión de CodePlex a partir de hoy (20 de febrero de 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

Gracias, ¿no debería el parámetro para Siguiente ser IgenerationSession, no IGenerationContext? Estoy usando autopoco 1.0.0.0, me he alojado a través de Nuget – MrBliz

+0

¿Y en qué ensamblado está TypeGenerationContextNode? – MrBliz

+1

@ Doozer1979 He mencionado que he usado el último código de autopoco.codeplex.com y creo que algo ha cambiado, sí, fue 'IGenerationSession' anteriormente. – TheVillageIdiot

Cuestiones relacionadas