Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Entity Framework - стойностите по подразбиране не се задават в таблицата на sql сървъра

Това е един от малкото проблеми, които са проблематични с Entity Framework. Да кажем, че имате клас, който изглежда така:

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

Сега искате да вмъкнете нов елемент:

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

Entity Framework знае как да обработва първичен ключ с автоматично нарастване поради дефиницията в EDMX. Няма да се опита да вмъкне стойност за Id Имот. Въпреки това, що се отнася до Entity Framework, CreatedOn има стойност:DateTime по подразбиране . Тъй като Entity Framework не може да каже „добре, има стойност, но трябва да я игнорирам“, той активно ще вмъкне записа с CreatedOn стойност на свойството, заобикаляйки стойността по подразбиране в дефиницията на вашата колона във вашата таблица.

Няма лесен начин да направите това. Можете или активно да зададете CreatedOn свойство на DateTime.Now когато поставите този елемент. Или можете да създадете двойка интерфейс и метод за разширение:

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

Редактиране: За да разширим тази точка, причината, поради която това е неразрешим проблем, е поради значението зад autoincrement поле и поле с default стойностно ограничение. По дефиниция полето за автоматично нарастване трябва винаги да се обработва от сървъра, като се използва семе и всичко това. Не можете да посочите стойност за поле за автоматично нарастване на вмъкване освен ако сте използвали SET IDENTITY INSERT ON . Стойността по подразбиране обаче е само намек, който гласи „ако не посоча никаква стойност, използвайте това“. Тъй като типовете стойности в .NET не могат да бъдат null, винаги ще има стойност и Entity Framework не може да заключи, че по подразбиране стойност за това поле по това време означава, че искате то да бъде по подразбиране на 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. Защо получавам Процедура очаква параметър '@statement' от тип 'ntext/nchar/nvarchar'. когато се опитвам да използвам sp_executesql?

  2. SQL заявка за намиране на последния ден от текущия месец?

  3. Добавяне на намек за заявка при извикване на функция с таблична стойност

  4. SQL Server еквивалентен на MySQL enum тип данни?

  5. писане на sql сървър от C#, не върнати грешки