Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entity Framework - Standardwerte werden nicht in der SQL Server-Tabelle festgelegt

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.