sql >> Databáze >  >> RDS >> Sqlserver

Entity Framework - výchozí hodnoty nejsou nastaveny v tabulce serveru SQL

Toto je jeden z mála problémů, které jsou u Entity Framework problematické. Řekněme, že máte třídu, která vypadá takto:

public class MyEntity
{
    // Id is a PK on the table with Auto-Increment
    public int Id { get; set; }

    // CreatedOn is a datetime, with a default value
    public DateTime CreatedOn { get; set; }
}

Nyní chcete vložit nový prvek:

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity())
}

Entity Framework ví, jak zacházet s automatickým přírůstkem primárního klíče díky definici v EDMX. Nepokusí se vložit hodnotu pro Id vlastnictví. Nicméně, pokud jde o Entity Framework, CreatedOn hodnota:výchozí DateTime . Protože Entity Framework nemůže říct „dobře, má hodnotu, ale měl bych ji ignorovat“, aktivně vloží záznam s CreatedOn vlastnost value, čímž se vynechá výchozí hodnota v definici sloupce v tabulce.

Neexistuje jednoduchý způsob, jak to udělat. Můžete buď aktivně nastavit CreatedOn vlastnost na DateTime.Now když tuto položku vložíte. Nebo můžete vytvořit rozhraní a metodu rozšíření:

public interface ICreatedOn
{
    public DateTime CreatedOn { get; set; }
}

public partial class MyEntity : ICreatedOn
{

}

public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
    if(entity != null)
        entity.CreatedOn = DateTime.Now;

    return entity;
}

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity().AsNew())
}   

Upravit: Abychom tento bod rozšířili, důvodem, proč se jedná o neřešitelný problém, je význam za autoincrement pole a pole s default hodnotové omezení. Pole automatického přírůstku by podle definice měl vždy zpracovávat server pomocí seedu a všeho toho jazzu. Nemůžete zadat hodnotu pro pole automatického přírůstku na vložení pokud použili jste SET IDENTITY INSERT ON . Výchozí hodnota je však jen nápověda, která říká „pokud neurčím žádnou hodnotu, použijte tuto“. Protože typy hodnot v .NET nemohou být null, vždy tam bude hodnota a Entity Framework nemůže odvodit, že výchozí hodnota pro toto pole v tu chvíli znamená, že chcete, aby bylo na serveru SQL výchozí.



  1. Sémantika uložených procedur / funkcí Oracle v transakčním kontextu

  2. vypočítat rozdíly mezi dvěma řádky v SQL

  3. Jak načíst rozevírací hodnoty z databáze a zobrazit v jsp

  4. Uložte výsledek dotazu do proměnné pomocí PL/pgSQL