Entityframework заменяет поле на ноль и выбрасывает исключение? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь добавить объект в базу данных SQL с помощью EntityFramework 6, он выглядит следующим образом:

Таблица:

    CREATE TABLE [dbo].[jobb](
    [starttid] [datetime] NULL,
    [sluttid] [datetime] NULL,
    [rowversion] [timestamp] NOT NULL,
    [service] [nvarchar](100) NOT NULL,
    [jobb_key] [int] NOT NULL,
CONSTRAINT [PK_service_jobb] PRIMARY KEY CLUSTERED 
(
    [jobb_key] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

Класс, представляющий таблицу:

public class Jobb
{
    public DateTime? starttid { get; set; }
    public DateTime? sluttid { get; set; }
    [Timestamp]
    public byte[] rowversion { get; set; }
    public string service { get; set; }
    [Key]
    public int jobb_key { get; set; }

}

Код, который пытается добавить новый объект в базу данных:

            using (var context = new ServiceJobbContext(_settingsService))
        {

            var current = await context.ServiceJobb.FirstOrDefaultAsync(c => c.jobb_key == serviceJobb.jobb_key);

            if (current == null)
                current = context.ServiceJobb.Add(serviceJobb);
            else
            {
                current.service = serviceJobb.service;
                current.sluttid = serviceJobb.sluttid;
                current.starttid = serviceJobb.starttid;
                current.jobb_key = serviceJobb.jobb_key;
            }
            await context.SaveChangesAsync();
            return serviceJobb;
        }

Я проверил, задан ли ключ jobb_key, но все же я получаю это исключение при запуске SaveChangesAsync:

SqlException: Невозможно вставить значение NULL в столбец 'jobb_key', таблица 'MyDB.dbo.jobb';столбец не допускает пустых значений.Вставить не удается.Оператор был прекращен.

Почему я получаю это исключение?

Ответы [ 2 ]

1 голос
/ 15 мая 2019

ваш ключевой столбец [jobb_key] [int] NOT NULL не равен нулю, когда вы пытаетесь вставить в него пустое значение в операции вставки, поэтому вам нужно изменить поле ключа, чтобы можно было вставлять его, или сделать его идентификатором для автоматической вставки.

поэтому в этом операторе не удалось вставить

current = context.ServiceJobb.Add(serviceJobb);

решение 1:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int jobb_key { get; set; }

, чтобы явно вставить его, потому что по умолчанию это DatabaseGeneratedOption.Identity, поэтому EF передает его как ноль

решение 2: сделать это идентификатором в таблице уровней в БД

 [jobb_key] [int] NOT NULL  IDENTITY(1,1) ,

проверить эту ссылку также автоматически сгенерированные свойства в EF

0 голосов
/ 15 мая 2019

Добавьте атрибут [Required] к полям not null и [DatabaseGenerated] к версии строки:

public class Jobb
{
    public DateTime? starttid { get; set; }

    public DateTime? sluttid { get; set; }

    [Timestamp]
    [DatabaseGenerated]
    public byte[] rowversion { get; set; }

    [Required]
    public string service { get; set; }

    [Key]
    public int jobb_key { get; set; }

}

Примечание: значения типа подразумеваются как [Required]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...