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.