Dies ist eines der wenigen Probleme, die mit Entity Framework problematisch sind. Angenommen, Sie haben eine Klasse, die so aussieht:
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; }
}
Nun wollen Sie ein neues Element einfügen:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework weiß aufgrund der Definition in EDMX, wie ein Primärschlüssel mit automatischer Inkrementierung behandelt wird. Es wird nicht versucht, einen Wert für Id
einzufügen Eigentum. In Bezug auf Entity Framework ist jedoch CreatedOn
hat ein Wert:die Standardeinstellung DateTime
. Da Entity Framework nicht sagen kann „Nun, es hat einen Wert, aber ich sollte ihn ignorieren“, fügt es aktiv den Datensatz mit dem CreatedOn
ein -Eigenschaftswert, wobei der Standardwert Ihrer Spaltendefinition in Ihrer Tabelle umgangen wird.
Es gibt keinen einfachen Weg, dies zu tun. Sie können den CreatedOn
entweder aktiv setzen -Eigenschaft auf DateTime.Now
wenn Sie diesen Artikel einfügen. Oder Sie können ein Paar aus einer Schnittstelle und einer Erweiterungsmethode erstellen:
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())
}
Bearbeiten: Um diesen Punkt zu erweitern, der Grund, warum dies ein unlösbares Problem ist, liegt in der Bedeutung hinter einem autoincrement
Feld und ein Feld mit einem default
Wertbeschränkung. Ein Auto-Increment-Feld sollte per Definition immer vom Server gehandhabt werden, indem ein Seed und all dieser Jazz verwendet werden. Sie können keinen Wert für ein Feld mit automatischer Erhöhung bei einer Einfügung angeben, es sei denn Sie haben SET IDENTITY INSERT ON
verwendet . Ein Standardwert ist jedoch nur ein Hinweis, der besagt:"Wenn ich keinen Wert festlege, verwende diesen". Da Werttypen in .NET nicht null sein können, gibt es immer einen Wert, und Entity Framework kann nicht auf den Standard schließen Wert für dieses Feld zu diesem Zeitpunkt bedeutet, dass es auf dem SQL-Server standardmäßig verwendet werden soll.