¿Cómo puedo implementar el patrón de enumeración con seguridad de tipos en la entidad framework rc2?
public class TestStatus
{
[Column("Id")]
public int Id { get; private set; }
[Column("Description")]
public string Description { get; private set; }
[Column("LongDescription")]
public string LongDescription { get; private set; }
private TestStatus(int id
, string description
, string longDescription)
{
Id = id;
Description = description;
LongDescription = longDescription;
}
public TestStatus() { }
public static readonly TestStatus Active = new TestStatus(1, "Active", "Active Long Description");
public static readonly TestStatus Pending = new TestStatus(2, "Pending", "Pending Long Description");
public static readonly TestStatus Cancelled = new TestStatus(3, "Cancelled", "Cancelled Long Description");
}
La estrategia de generación de id se establece en OnModelCreating:
builder.Entity<TestStatus>()
.Property(s => s.Id)
.ValueGeneratedNever();
Este es un ejemplo simplificado, pero el código real estaba trabajando en rc1. Al actualizar a rc2, tuve que agregar los atributos de columna para que las propiedades se asignaran (supongo que esto se debe al configurador privado). Al intentar asignar el valor de enumeración de seguridad de tipos:
var i = new TestItem
{
Name = "Test Item 2",
Status = TestStatus.Active
};
_context.Items.Add(i);
_context.SaveChanges();
Recibo uno de los siguientes errores dependiendo del caso de uso:
InvalidOperationException: la instancia del tipo de entidad 'TestStatus' no se puede rastrear porque ya se está rastreando otra instancia de este tipo con la misma clave. Para las nuevas entidades, considere usar un IIdentityGenerator para generar valores clave únicos.
O
SqlException: Infracción de la restricción PRIMARY KEY 'PK_Statuses'. No se puede insertar una clave duplicada en el objeto 'dbo.Statuses'. El valor de la clave duplicada es (1). La instrucción se ha terminado.
Entiendo el error. EF cree que estoy intentando crear una nueva instancia con el mismo Id. ¿Cómo puedo decirle a EF que estas instancias deben considerarse iguales? Puedo solucionar este problema alejándome del patrón de enumeración de tipos seguros. Solo me gustaría hacer que funcione con el patrón si es posible. Estaba trabajando en rc1.
Dado que está utilizando el Patrón de Tipo Seguro, no es necesario que persista todo el objeto. Simplemente almacene la identificación y cree una envoltura como tal:
[Required]
protected string ObjectTypeValue { get; set; }
[NotMapped]
public ObjectType Type
{
get { return ObjectType.Parse(ObjectTypeValue); }
set { ObjectTypeValue = value.Print(); }
}
Por algunas razones, uso una cadena como identificación, pero puedes usar el tipo que quieras.