Невозможно вставить явное значение для столбца идентификаторов в таблице Entity Framework - PullRequest
0 голосов
/ 02 августа 2020
• 1000

В моей модели объявлено свойство STOCKID, а в моем T- SQL оно установлено как IDENTITY(1,1).

В моей модели я добавил [DatabaseGenerated(DatabaseGeneratedOption.Identity)], но это не помогло

Есть предложения?

Модель

public class Stock
{
    #region Day 1's

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]       
    public int Id { get; set; }

T- SQL

CREATE TABLE [dbo].[LowFloatStocks] 
(
    [Id]                   INT             IDENTITY (1, 1) NOT NULL,
    [Date]                 DATE            NOT NULL,
    [Ticker]               NVARCHAR (4)    NOT NULL,
    [PreviousClose]        DECIMAL (4, 2)  DEFAULT ((4.00)) NOT NULL,
    [PM_OpeningPrice]      DECIMAL (18, 2) DEFAULT ((3)) NOT NULL,
    [OpeningPrice]         DECIMAL (18, 2) NOT NULL,
    [PMFadePercent]        AS (ROUND(([OpeningPrice] - [PM_OpeningPrice]) / [PM_OpeningPrice], (4)) * (100.0)) PERSISTED NOT NULL,
    [GainPercent]          AS (ROUND(([High] - [OpeningPrice]) / [OpeningPrice], (4)) * (100.0)) PERSISTED NOT NULL,
    [GapPercent]           AS (ROUND(([OpeningPrice] - [PreviousClose]) / [PreviousClose], (4)) * (100.0)) PERSISTED NOT NULL,
    [Spike]                DECIMAL (18, 2) NOT NULL,
    [1stSpike%]            AS (ROUND(([Spike] - [OpeningPrice]) / [OpeningPrice], (4)) * (100.0)) PERSISTED NOT NULL,
    [High]                 DECIMAL (18, 2) NOT NULL,
    [HighPercent]          AS (ROUND(([High] - [PreviousClose]) / [PreviousClose], (4)) * (100.0)) PERSISTED NOT NULL,
    [Low]                  DECIMAL (18, 2) NOT NULL,
    [LowPercent]           AS (ROUND(([Low] - [PreviousClose]) / [PreviousClose], (4)) * (100.0)) PERSISTED NOT NULL,
    [Close]                DECIMAL (18, 2) DEFAULT ((4)) NOT NULL,
    [ClosePercent]         AS              (round(([Close]-[PreviousClose])/[PreviousClose],(4))*(100.0)) PERSISTED NOT NULL,
    [ClosevHigh]           AS              (round(([High]-[Close])/[Close], (4))*(100)) PERSISTED NOT NULL,
    [ClosevOpen]           AS              (round(([OpeningPrice]-[Close])/[OpeningPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [CloseLessEqualToOpen] AS              (CONVERT([nchar](3),case when [Close]<=[OpeningPrice] then 'Yes' else 'No' end)) PERSISTED NOT NULL,
    [CloseRed]             AS              (CONVERT([nchar](3),case when [Close]<[OpeningPrice] then 'Yes' else 'No' end)) PERSISTED NOT NULL,
    [Catalyst]             NVARCHAR (50)   NOT NULL,
    [Float]                DECIMAL (18, 3) NOT NULL,
    [Dilution]             NCHAR (3)       NOT NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Метод добавления акций

public ICommand AddCommand => _addCommand ?? (_addCommand = new RelayCommand(param => this.AddStock()));


    #endregion 

    #region Actions

    private void AddStock()
    {
        using (var stocks = new AppDbContext())
        {
            stocks.LowFloatStocks.Add(stock);
            stocks.SaveChanges();
            Stocks = stocks.LowFloatStocks.ToList();
            Clear();


        }
    }

1 Ответ

1 голос
/ 02 августа 2020

Вы должны использовать [DatabaseGenerated(DatabaseGeneratedOption.None)], если хотите создавать ключи самостоятельно. [DatabaseGenerated(DatabaseGeneratedOption.Identity)] означает, что вы позволяете базе данных обрабатывать создание первичного ключа. Как правило, это лучший вариант, потому что два экземпляра вашего программного обеспечения, пытающиеся создать один и тот же первичный ключ, приведут к ошибке. Это маловероятный сценарий, но все же: позвольте базе данных создать первичные ключи. Поскольку вы используете Database First, у вас нет возможности изменить DatabaseGeneratedOption без обновления вашей базы данных. Если вы создали модель Code First из базы данных, у вас есть возможность изменить DatabaseGeneratedOption, создать новую миграцию и обновить базу данных. Но это может быть нежелательно, потому что Entity Framework может отбросить всю таблицу и воссоздать ее.

Пожалуйста, покажите Код, который создает Entity, добавленный в stocks.LowFloatStocks.Add(stock);. Вы присвоили значение Id? Если да, постарайтесь этого не делать.

В противном случае попробуйте Решение, предложенное @viveknuna в комментариях:

stock.Id = 0; 
stocks.LowFloatStocks.Add(stock); 
stocks.SaveChanges();
...