Ядро Entity Framework не сохраняет изменения (без первичного ключа, таблица с одной строкой) - PullRequest
0 голосов
/ 17 июня 2020

У меня есть устаревшая база данных с таблицей, в которой есть только одна строка без первичного ключа. Когда я пытаюсь обновить эту строку, ничего не происходит. Я много искал и наткнулся на эту строку кода (dbf.Entry(nextPro).State = EntityState.Modified;). Когда я добавил этот код, я получил сообщение об ошибке: «Невозможно отследить экземпляр типа NxtId, потому что он не имеет первичного ключа. Можно отслеживать только типы объектов с первичными ключами».

Я не могу удалить ряд и добавьте новый. Я не могу добавить первичный ключ. У меня есть единственный вариант как-то обновить строку.

var nextPro = dbf.NxtId.FirstOrDefault();

nextPro.ProductNo = 239071;
dbf.Entry(nextPro).State = EntityState.Modified;
dbf.SaveChanges();

Entity:

public partial class NxtId
{
    public int? ProductNo { get; set; }
    public int? Uid { get; set; }
    [Key]
    public int? SatCode { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Вы не можете отслеживать или изменять сущность с помощью Entity Framework, если у нее нет ключа. Однако вы все равно можете читать данные из базы данных. Кроме того, вы можете запускать собственные написанные вручную запросы SQL, используя метод расширения RelationalDatabaseFacadeExtensions.ExecuteSqlRaw(). Используйте его, чтобы отправить обычный запрос UPDATE, а затем снова прочитать объект из базы данных, чтобы получить новые значения.

dbf.Database.ExecuteSqlRaw($"UPDATE {nameof(NxtId)} SET {nameof(NxtId.ProductNo)} = {{0}}", 239071);
var nextPro = dbf.NxtId.Single();
0 голосов
/ 18 июня 2020

Код, который у меня работает (Entity Framework Core не любит работать с необработанными sql). Поэтому мне пришлось найти команду, которая все еще работает.

        using (SqlConnection connection = new SqlConnection(Configuration["ConnectionStrings:Test"]))
        {
            SqlCommand command = new SqlCommand("UPDATE dbo.NxtID SET ProductNo =" + newProductNo, connection);
            command.Connection.Open();
            command.ExecuteNonQuery();
        }
...