Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Entity Framework — wartości domyślne nie są ustawiane w tabeli serwera sql

Jest to jeden z niewielu problemów, które są problematyczne z Entity Framework. Załóżmy, że masz zajęcia, które wyglądają tak:

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; }
}

Teraz chcesz wstawić nowy element:

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

Entity Framework wie, jak obsłużyć klucz podstawowy z automatycznym przyrostem ze względu na definicję w EDMX. Nie będzie próbował wstawić wartości dla Id własność. Jednak jeśli chodzi o Entity Framework, CreatedOn ma wartość:domyślna DateTime . Ponieważ Entity Framework nie może powiedzieć „dobrze, ma wartość, ale powinienem ją zignorować”, aktywnie wstawi rekord z CreatedOn wartość właściwości, z pominięciem wartości domyślnej w definicji kolumny w tabeli.

Nie ma na to łatwego sposobu. Możesz albo aktywnie ustawić CreatedOn właściwość DateTime.Now po wstawieniu tego elementu. Możesz też utworzyć interfejs i parę metod rozszerzenia:

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())
}   

Edytuj: Rozwijając tę ​​kwestię, powodem, dla którego jest to nierozwiązywalny problem, jest znaczenie stojące za autoincrement pole i pole z default ograniczenie wartości. Z definicji pole auto-inkrementacji powinno być zawsze obsługiwane przez serwer, używając zalążka i całej tej frajdy. Nie można określić wartości pola automatycznego przyrostu we wstawce chyba, że użyłeś SET IDENTITY INSERT ON . Jednak wartość domyślna to tylko wskazówka, która mówi „jeśli nie określę żadnej wartości, użyj tego”. Ponieważ typy wartości w .NET nie mogą mieć wartości null, zawsze będzie wartość, a Entity Framework nie może wywnioskować, że domyślna wartość tego pola w tym czasie oznacza, że ​​chcesz, aby była ona domyślna na serwerze SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zwróć więcej niż 24 godziny w formacie gg:mm:ss w serwerze SQL 2008

  2. Tabela SELECT i UPDATE, aby nie nakładać się na wątki

  3. SQL Server 2005 Pivot na nieznanej liczbie kolumn

  4. Haszowanie ponad 8000 bajtów w SQL Server

  5. Jak zwrócić listę typów danych w SQL Server (T-SQL)