mvc framework foreign first dataannotations data con code and c# entity-framework data-binding azure-sql-database sqldatatypes

foreign - C#: Change DataType de recuperación para Entity Framework



entity framework foreign key (1)

Si bien puede lanzar implícitamente un bigint a una int en SQL Server , parece que los tipos EDM de marcos de Entity (que es realmente lo que está tratando) no permite una transformación implícita de un tipo entero de 64 bits a un 32 -bit tipo entero.

Probablemente sea por una buena razón, porque podría desbordarse fácilmente y tener valores que no encajan en los campos int .

Dicho esto, debe tener dos clases base, una para una ID int y otra para una ID long . No es bonito, pero impone la lógica que definitivamente deseas; no podrá almacenar valores que son más grandes que los que pueden caber en una int en la base de datos, entonces ¿por qué querría poder hacerlo en el nivel de código? El marco de la Entidad está haciendo lo correcto aquí al no permitirle aplicar esa transformación.

Estoy intentando convertir un proyecto que actualmente usa un marco DAO personalizado para usar Entity Framework. El sistema es bastante grande, por lo que los cambios en la base de datos (una base de datos SQL Azure si eso importa) no son particularmente viables y deberían evitarse si es posible.

El problema es con la columna ID. Lamentablemente, cuando se creó el sistema, hay algunas tablas que tienen un bigint datos bigint y otras que tienen un int , pero todos los modelos provienen de una clase base que tiene una ID long . El marco anterior fue capaz de manejar esta situación, pero no he podido encontrar una manera de hacerlo con el marco de la entidad.

A continuación se muestra el ejemplo más trivial que puedo pensar:

public class Context : DbContext { public IDbSet<Foo> Foos {get;set;} public IDbSet<Bar> Bars {get;set;} } public abstract class BaseClass { public long ID; } public class Foo : BaseClass { ... } public class Bar : BaseClass { ... } SQL Table: Foo +-------------+ | id : bigint | | ... | +-------------+ SQL Table : Bar +-------------+ | id : int | | ... | +-------------+

Cuando intento cargar un modelo de Bar , obtengo este error:

The ''ID'' property on ''BaseClass'' could not be set to a ''Int32'' value. You must set this property to a non-null value of type ''Int64''.

Me gustaría encontrar una forma de decirle al sistema que Bar tiene entradas, mientras que Foo tiene anhelos. Intenté reemplazar OnModelCreating en el contexto y definir HasColumnType for Bar . Eso me dio un nuevo error:

Schema specified is not valid. Errors: (105,12) : error 2019: Member Mapping specified is not valid. The type ''Edm.Int64[Nullable=False,DefaultValue=]'' of member ''ID'' in type ''Bar'' is not compatible with ''SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]'' of member ''ID'' in type ''CodeFirstDatabaseSchema.Bar''.

Me parece que si solo pudiera cambiar el tipo de datos esperado para el ID BaseClass a int antes de enviar la solicitud al servidor, entonces debería ser capaz de convertir hasta long después de recibir la respuesta. Idealmente, me gustaría hacer esto por clase.

¿Alguien puede señalarme en la dirección correcta?