C # Не удается вставить явное значение для столбца идентификаторов в таблице «Аренда», когда IDENTITY_INSERT установлен на OFF - PullRequest
0 голосов
/ 11 мая 2018

В настоящее время я изучаю ASP.NET MVC, и я учусь получать объект по его идентификатору и вставлять его ссылку на базу данных. Однако я получаю эту ошибку

Невозможно вставить явное значение для столбца идентификаторов в таблице «Аренда», если для параметра IDENTITY_INSERT установлено значение OFF

Я прочитал и заметил, что некоторые люди говорят, чтобы отключить вставку идентификатора, потому что идентификатор таблицы, на которую ссылаются, автоматически увеличивается? Однако я прочитал, что этот метод не рекомендуется, потому что он, по-видимому, блокирует таблицу или полезен только для отдельных пользователей? Могу ли я узнать, как правильно это сделать?

Это код моего контроллера, который пытается добавить новый Прокат

[HttpPost]
public IHttpActionResult CreateNewRental(RentalDTO RentalDTO)
{
    if (RentalDTO.MovieIds.Count == 0)
    {
        return BadRequest();
    }
    var customer = _context.Customers.SingleOrDefault(c => c.Id == RentalDTO.CustomerId);
    if (customer == null)
    {
        return BadRequest("Customer ID is not valid");
    }
    var movies = _context.Movies.Where(m => RentalDTO.MovieIds.Contains(m.Id)).ToList();
    if (movies.Count != RentalDTO.MovieIds.Count)
    {
        return BadRequest();
    }
    foreach (var movie in movies)
    {
        if (movie.NumberAvailable < 1)
        {
             return BadRequest();
        }
        movie.NumberAvailable--;
        var rental = new Rentals
        {
            Customer = customer,
            Movie = movie,
            DateRented = DateTime.Now,
        };
        _context.Rentals.Add(rental);
    }
    _context.SaveChanges();
    return Ok();
}

Это моя модель проката

public class Rentals
{
    public byte Id { get; set; }
    [Required]
    public Customers Customer { get; set; }
    [Required]
    public Movies Movie { get; set; }
    public DateTime DateRented { get; set; }
    public DateTime? DateReturned { get; set; }
}

Это миграция, которую я использовал для создания таблицы

CreateTable(
            "dbo.Rentals",
            c => new
                {
                    Id = c.Byte(nullable: false, identity: true),
                    DateRented = c.DateTime(nullable: false),
                    DateReturned = c.DateTime(),
                    Customer_Id = c.Int(nullable: false),
                    Movie_Id = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.Customers", t => t.Customer_Id, cascadeDelete: true)
            .ForeignKey("dbo.Movies", t => t.Movie_Id, cascadeDelete: true)
            .Index(t => t.Customer_Id)
            .Index(t => t.Movie_Id);

ОБНОВЛЕНИЕ:

Я отладил свой код и понял, что при добавлении нового проката в качестве идентификатора было установлено значение 0. Как мне установить это автоматически?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Мы столкнулись с этой проблемой сегодня, также в столбце идентификаторов байтового типа.Это не произошло в таблицах со столбцом идентификаторов типа int , но в случае столбца byte то, что мы предположили как поведение по умолчанию, не выполнялось.Несмотря на то, что он был помечен HasKey в конфигурации объекта, наша система все еще пыталась вставить значение в столбец идентификаторов.

Решение, которое мы нашли, заключалось в добавлении свойства в конфигурацию объекта, отметив его явнокак значение, сгенерированное базой данных:

Property(c => c.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

с использованием System.ComponentModel.DataAnnotations.Schema )

Как только мы установим это свойство,ошибка вставки была решена.

0 голосов
/ 11 мая 2018

Один из столбцов в вашей таблице аренды - это столбец идентификаторов (предположим, что это столбец идентификаторов).Как правило, вы не хотите явно устанавливать значение столбца идентификаторов, поэтому ваш сервер SQL не позволяет вам включить параметр (IDENTITY_INSERT).

Чтобы избежать этой проблемы, любой механизм сохранения изменений должен знать, что при вставке вы не указываете столбец идентификаторов.Вместо этого вы указываете остальные столбцы и позволяете базе данных определять значение столбца идентификаторов.Аналогично, при обновлении вы обычно не будете изменять этот столбец, поэтому ваше обновление не должно пытаться изменить его.

Если вы предоставите больше информации о том, какую платформу вы используете для сохранения модели, мы можембыть в состоянии предоставить более конкретные ответы.

Все это меняется, если вам действительно нужно указать конкретное значение для столбца идентификаторов (например, копирование данных из одной базы данных в другую - один из примеров, который я лично сделалэтот).В этом случае вы можете использовать оператор set IDENTITY_INSERT ON, чтобы разрешить вставку, а затем выключите его, когда закончите.

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