Как заставить Вставить и сохранить значение идентичности? - PullRequest
0 голосов
/ 03 июля 2019

Я создал модель данных сущности ADO.NET и выбрал EF Designer из базы данных.В моей таблице Cage есть столбец с первичным ключом Identity CageNo.У меня есть код, подобный этому:

public static void Insert<T>(this DbContext context, T obj, bool InsertKeepIdentity = false) where T : class
    {
        if (InsertKeepIdentity)
        {
            context.SetIdentityInsert<T>(true);
        }
        context.Entry(obj).State = EntityState.Added;
        if (InsertKeepIdentity)
        {
            context.SaveChanges();
            context.SetIdentityInsert<T>(false);
        }
    }
public static string GetTableName<T>(this DbContext context) where T : class
    {
        ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;

        return objectContext.GetTableName<T>();
    }

    public static string GetTableName<T>(this ObjectContext context) where T : class
    {
        string sql = context.CreateObjectSet<T>().ToTraceString();
        Regex regex = new Regex("FROM (?<table>.*) AS");
        Match match = regex.Match(sql);

        string table = match.Groups["table"].Value;
        return table;
    }
public static int SetIdentityInsert<T>(this DbContext context, bool isOn) where T : class
    {
        return context.Database.ExecuteSqlCommand($"SET IDENTITY_INSERT {context.GetTableName<T>()} {(isOn ? "ON" : "OFF")}");
    }

У меня есть ошибка, подобная этой:

SqlException: Явное значение должно быть указано для столбца идентификаторов в таблице 'Cage' либо когда установлен IDENTITY_INSERTON или когда пользователь репликации вставляет в столбец идентификации NOT FOR REPLICATION.

запрос, подобный следующему:

exec sp_executesql N'INSERT [dbo]. [Cage] ([CageId], [IsActive], [Амортизация], [Описание], [CreatedOn], [ОбновленоOn], [SeedlingNo], [IsSystem]) ЗНАЧЕНИЯ (@ 0, @ 1, @ 2, NULL, @ 3,@ 4, @ 5, @ 6) ВЫБРАТЬ [CageNo] ИЗ [dbo]. [Cage] WHERE @@ ROWCOUNT> 0 И [CageNo] = scope_identity () ', N' @ 0 varchar (100), @ 1 бит,@ 2 десятичных (19,4), @ 3 datetime2 (7), @ 4 datetime2 (7), @ 5 bigint, @ 6 бит ', @ 0 =' K0001 ', @ 1 = 1, @ 2 = 2000.0000, @3 = '2019-06-29 10: 51: 26.6570000', @ 4 = '2019-07-03 17: 22: 16.1011887', @ 5 = 4, @ 6 = 0

ТаблицаCage:

CREATE TABLE [dbo].[Cage]
(
    [CageNo] BIGINT NOT NULL IDENTITY , 
    [CageId] VARCHAR(100) NOT NULL, 
    [IsActive] BIT NOT NULL, 
    [Depreciation] MONEY NOT NULL, 
    [Description] VARCHAR(MAX) NULL, 
    [CreatedOn] DATETIME NOT NULL, 
    [UpdatedOn] DATETIME NOT NULL, 
    [SeedlingNo] BIGINT NULL, 
    [IsSystem] BIT NOT NULL DEFAULT 0, 
    CONSTRAINT [PK_Cage] PRIMARY KEY ([CageNo]), 
    CONSTRAINT [AK_Cage_Column] UNIQUE ([CageId])
)

Почему запрос для CageNo не вставлен или не сгенерирован?

...