sql >> Database teknologi >  >> RDS >> Sqlserver

Entity Framework fungerer ikke med den tidsmæssige tabel

Der er to løsninger på dette problem:

  1. I egenskabsvinduet for kolonnen i EDMX-designeren skal du ændre StoreGeneratedPattern i PERIOD kolonner (ValidFrom og ValidTo i mit tilfælde) skal være identity . Identitet er bedre end beregnet, da computed vil få EF til at opdatere værdierne på en Insert og Update i modsætning til blot en insert med identity
  2. Opret en IDbCommandTreeInterceptor implementering for at fjerne periodekolonnerne. Dette er min foretrukne løsning, da det ikke kræver yderligere arbejde, når du tilføjer nye tabeller til modellen.

Her er min implementering:

using System.Data.Entity.Infrastructure.Interception; 
using System.Data.Entity.Core.Common.CommandTrees; 
using System.Data.Entity.Core.Metadata.Edm; 
using System.Collections.ObjectModel;

internal class TemporalTableCommandTreeInterceptor : IDbCommandTreeInterceptor
{
    private static readonly List<string> _namesToIgnore = new List<string> { "ValidFrom", "ValidTo" };

    public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
    {
        if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
        {
            var insertCommand = interceptionContext.Result as DbInsertCommandTree;
            if (insertCommand != null)
            {
                var newSetClauses = GenerateSetClauses(insertCommand.SetClauses);

                var newCommand = new DbInsertCommandTree(
                    insertCommand.MetadataWorkspace,
                    insertCommand.DataSpace,
                    insertCommand.Target,
                    newSetClauses,
                    insertCommand.Returning);

                interceptionContext.Result = newCommand;
            }

            var updateCommand = interceptionContext.Result as DbUpdateCommandTree;
            if (updateCommand != null)
            {
                var newSetClauses = GenerateSetClauses(updateCommand.SetClauses);

                var newCommand = new DbUpdateCommandTree(
                    updateCommand.MetadataWorkspace,
                    updateCommand.DataSpace,
                    updateCommand.Target,
                    updateCommand.Predicate,
                    newSetClauses,
                    updateCommand.Returning);

                interceptionContext.Result = newCommand;
            }
        }
    }

    private static ReadOnlyCollection<DbModificationClause> GenerateSetClauses(IList<DbModificationClause> modificationClauses)
    {
        var props = new List<DbModificationClause>(modificationClauses);
        props = props.Where(_ => !_namesToIgnore.Contains((((_ as DbSetClause)?.Property as DbPropertyExpression)?.Property as EdmProperty)?.Name)).ToList();

        var newSetClauses = new ReadOnlyCollection<DbModificationClause>(props);
        return newSetClauses;
    }
}

Registrer denne interceptor med EF ved at køre følgende hvor som helst i din kode, før du bruger din kontekst:

DbInterception.Add(new TemporalTableCommandTreeInterceptor());


  1. PostgreSQL brugertilladelser

  2. Sorter efter ugedag fra mandag til søndag

  3. MySQL enkelt citatindsættelsesfejl

  4. Tilslutning af AnySQL Maestro til Salesforce.com