mvc mezclar example asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 entity-framework-5

asp.net mvc - mezclar - Cómo establecer NewId() para GUID en el marco de entidad



guid c# example (5)

La respuesta de Paul es correcta, pero la implementación de la guía secuencial se puede mejorar. Esta implementación de guid secuencial aumenta más a menudo y evita los mismos números si se crea en el mismo servidor.

Para evitar la rotura del enlace , el código:

public class SequentialGuid { public DateTime SequenceStartDate { get; private set; } public DateTime SequenceEndDate { get; private set; } private const int NumberOfBytes = 6; private const int PermutationsOfAByte = 256; private readonly long _maximumPermutations = (long)Math.Pow(PermutationsOfAByte, NumberOfBytes); private long _lastSequence; public SequentialGuid(DateTime sequenceStartDate, DateTime sequenceEndDate) { SequenceStartDate = sequenceStartDate; SequenceEndDate = sequenceEndDate; } public SequentialGuid() : this(new DateTime(2011, 10, 15), new DateTime(2100, 1, 1)) { } private static readonly Lazy<SequentialGuid> InstanceField = new Lazy<SequentialGuid>(() => new SequentialGuid()); internal static SequentialGuid Instance { get { return InstanceField.Value; } } public static Guid NewGuid() { return Instance.GetGuid(); } public TimeSpan TimePerSequence { get { var ticksPerSequence = TotalPeriod.Ticks / _maximumPermutations; var result = new TimeSpan(ticksPerSequence); return result; } } public TimeSpan TotalPeriod { get { var result = SequenceEndDate - SequenceStartDate; return result; } } private long GetCurrentSequence(DateTime value) { var ticksUntilNow = value.Ticks - SequenceStartDate.Ticks; var result = ((decimal)ticksUntilNow / TotalPeriod.Ticks * _maximumPermutations - 1); return (long)result; } public Guid GetGuid() { return GetGuid(DateTime.Now); } private readonly object _synchronizationObject = new object(); internal Guid GetGuid(DateTime now) { if (now < SequenceStartDate || now > SequenceEndDate) { return Guid.NewGuid(); // Outside the range, use regular Guid } var sequence = GetCurrentSequence(now); return GetGuid(sequence); } internal Guid GetGuid(long sequence) { lock (_synchronizationObject) { if (sequence <= _lastSequence) { // Prevent double sequence on same server sequence = _lastSequence + 1; } _lastSequence = sequence; } var sequenceBytes = GetSequenceBytes(sequence); var guidBytes = GetGuidBytes(); var totalBytes = guidBytes.Concat(sequenceBytes).ToArray(); var result = new Guid(totalBytes); return result; } private IEnumerable<byte> GetSequenceBytes(long sequence) { var sequenceBytes = BitConverter.GetBytes(sequence); var sequenceBytesLongEnough = sequenceBytes.Concat(new byte[NumberOfBytes]); var result = sequenceBytesLongEnough.Take(NumberOfBytes).Reverse(); return result; } private IEnumerable<byte> GetGuidBytes() { var result = Guid.NewGuid().ToByteArray().Take(10).ToArray(); return result; } }

Estoy creando una muestra asp.net mvc4. En este creé una columna Id como GUID en la tabla de muestra de datacontext.

public class Sample { [Required] public Guid ID { get; set; } [Required] public string FirstName { get; set; } }

Esta es la tabla de entidades

CreateTable( "dbo.Samples", c => new { ID = c.Guid(nullable: false), FirstName = c.String(nullable: false) }) .PrimaryKey(t => t.ID);

Id pase 00000000-0000-0000-0000-000000000000.

Cómo establecer newid() en GUID y dónde tengo que establecer.


Encontré el mismo problema con el registro de Nlog en la base de datos. Lo que hice fue abrir intencionalmente el archivo de migración e hice los siguientes cambios

CreateTable( "dbo.Samples", c => new { ID = c.Guid(nullable: false,identity:true), FirstName = c.String(nullable: false) }) .PrimaryKey(t => t.ID);

el parámetro de identidad realmente creó la tabla con defaultvalue como newsequentialid() en la tabla.


Sé que la pregunta es bastante antigua, pero si alguien tiene ese problema sugiero tal solución:

protected Guid GetNewId() { SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString); var query = "select newid()"; conn.Open(); SqlCommand com = new SqlCommand(query, conn); var guid = new Guid(com.ExecuteScalar().ToString()); conn.Close(); return guid; }

Puede obtener newid de la base de datos SQL cuando crea su nuevo objeto. Para mi funciona :) (pero no sé, es una buena práctica)

Cómo lo usa:

var myNewGuidValue = GetNewId();


Esto también se puede hacer con atributos:

[Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid AddressID { get; set; }


Yo recomendaría simplemente usar long para su tipo de identificación. Simplemente "funciona" y tiene algunas mejoras de rendimiento sobre GUID. Pero si desea usar un GUID, debe usar un GUID secuencial y configurarlo en el constructor. También haría ID ID un setter private :

public class Sample { public Sample() { ID = GuidComb.Generate(); } [Required] public Guid ID { get; private set; } [Required] public string FirstName { get; set; } }

GUID secuencial

public static class GuidComb { public static Guid Generate() { var buffer = Guid.NewGuid().ToByteArray(); var time = new DateTime(0x76c, 1, 1); var now = DateTime.Now; var span = new TimeSpan(now.Ticks - time.Ticks); var timeOfDay = now.TimeOfDay; var bytes = BitConverter.GetBytes(span.Days); var array = BitConverter.GetBytes( (long)(timeOfDay.TotalMilliseconds / 3.333333)); Array.Reverse(bytes); Array.Reverse(array); Array.Copy(bytes, bytes.Length - 2, buffer, buffer.Length - 6, 2); Array.Copy(array, array.Length - 4, buffer, buffer.Length - 4, 4); return new Guid(buffer); } }