c# - remove - entity framework delete all
Truncamiento decimal no deseado (2)
Aquí hay un buen tutorial para formatear números decimales
D.Debug.WriteLine("ProductList: {0}, {1:0.000}", p.Name, p.Fineness);
// just two decimal places
String.Format("{0:0.00}", 123.4567); // "123.46"
String.Format("{0:0.00}", 123.4); // "123.40"
String.Format("{0:0.00}", 123.0); // "123.00"
// max. two decimal places
String.Format("{0:0.##}", 123.4567); // "123.46"
String.Format("{0:0.##}", 123.4); // "123.4"
String.Format("{0:0.##}", 123.0); // "123"
// at least two digits before decimal point
String.Format("{0:00.0}", 123.4567); // "123.5"
String.Format("{0:00.0}", 23.4567); // "23.5"
String.Format("{0:00.0}", 3.4567); // "03.5"
String.Format("{0:00.0}", -3.4567); // "-03.5"
//Zero formatting
String.Format("{0:0.0}", 0.0); // "0.0"
String.Format("{0:0.#}", 0.0); // "0"
String.Format("{0:#.0}", 0.0); // ".0"
String.Format("{0:#.#}", 0.0); // ""
Mi modelo:
public class Product
{
...
public decimal Fineness { get; set; }
...
}
Sembrando la base de datos:
new List<Product>
{
new Product { ..., Fineness = 0.757M, ... },
new Product { ..., Fineness = 0.674M, ... },
new Product { ..., Fineness = 0.475M, ... }
}.ForEach(p => context.Products.Add(p));
Consultando la base de datos para probar siembra:
var products = db.Products.ToList();
foreach (var p in products)
{
S.D.Debug.WriteLine("ProductList: {0}, {1}", p.Name, p.Fineness);
}
Salida de consola:
ProductList: Test Product, 0.75
ProductList: Test Product, 0.67
ProductList: Test Product, 0.47
¿Estoy haciendo algo realmente tonto o algo así? Todo se está truncando a 2 decimales.
Solución - Gracias a Patrick:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>().Property(x => x.Fineness).HasPrecision(10, 5);
}
Así que tiene sus modelos de entidad estándar definidos, aquí está el producto con id y decimal, junto con todo lo que necesite, etc.
public class Product
{
public int Id { get; set; }
public decimal Fineness { get; set; }
}
Así que he definido un iniciador, en cuyo caso la base de datos se eliminará y volverá a crear la información generada que he proporcionado, cada vez que ejecuto y ejecuto mi aplicación, esto se llamará.
public class Initializer : DropCreateDatabaseAlways<Context>
{
protected override void Seed(Context context)
{
// note how i am specifying it here as 4 digits after the decimal point
// and for the second one, 3 digits
// this is where EF precision must be configured so you can expect
// the values you tell EF to save to the db
context.Products.Add(new Product() {Id = 1, Fineness = 145.2442m});
context.Products.Add(new Product() {Id = 2, Fineness = 12.341m});
}
}
public class Context : DbContext
{
public IDbSet<Product> Products { get; set; }
public Context()
{
// I always explicitliy define how my EF should run, but this is not needed for the answer i am providing you
Configuration.AutoDetectChangesEnabled = true;
Configuration.ProxyCreationEnabled = true;
Configuration.LazyLoadingEnabled = true;
Configuration.ValidateOnSaveEnabled = true;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// so here, I am override the model configuration which is what
// EF can use in order to set-up the behaviour of how everything
// is configured in the database, from associations between
// multiple entities and property validation, Null-able, Precision, required fields etc
modelBuilder.Configurations.Add(new ProductConfiguration());
}
}
public class ProductConfiguration : EntityTypeConfiguration<Product>
{
public ProductConfiguration()
{
ToTable("Product");
HasKey(x => x.Id).Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// HAS PRECISION.
// Enforces how the value is to be stored in the database
// Here you can see I set a scale of 3, that''s 3 digits after
// the decimal. Notice how in my seed method, i gave a product 4 digits!
// That means it will NOT save the product with the other trailing digits.
Property(x => x.Fineness).HasPrecision(precision: 10, scale: 3);
}
}
Con el Explorador de objetos de SQL Server, puedo ver mi producto de ejemplo localdb que hice para ver cómo EF configuró mi base de datos.
[TestFixture]
public class Tests
{
[Test]
public void Test()
{
Database.SetInitializer(new Initializer());
using (var ctx = new Context())
{
// assert our findings that it is indeed not what we actually specified in the seed method, because of our Entity configuration with HasPrecision.
Product product1 = ctx.Products.Find(1);
Assert.AreEqual(145.244m, product1.Fineness);
Product product2 = ctx.Products.Find(2);
Assert.AreEqual(12.341m, product2.Fineness);
}
}
}
Por lo tanto, debemos asegurarnos de que la base de datos sepa cómo debe almacenar nuestro valor decimal, configurando nuestra entidad mediante la configuración del generador de modelos del Entity Framework, mediante el uso de FluentApi
, podemos configurar los rasgos de propiedad a través de EntityTypeConfiguration<T>
.