EF Core — невозможно сохранить более 1 объекта с помощью подхода TPTC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 EF Core — невозможно сохранить более 1 объекта с помощью подхода TPT

Сообщение Anonymous »

Мы переносим наше приложение .NET Framework и EF6 на .NET 6 и EF Core v6.
Наше приложение использует подход TPT в одной из наших моделей. Я прочитал все статьи, связанные с TPT, и некоторые вопросы по SO, но, похоже, это не дает решения моей проблемы.
У меня есть пример кода, основанный на этой статье.

Код: Выделить всё

    public class TPTUser
{
public int Id { get; set; }
public string Username { get; set; }
public string Email { get; set; }
}

public class TPTStudent : TPTUser
{
public string CGPA { get; set; }
public string Major { get; set; }
}

public class TPTTeacher : TPTUser
{
public string Designation { get; set; }
public string Speciality { get; set; }
}
Мой контекст базы данных:

Код: Выделить всё

public class TestContext : DbContext
{
public DbSet TPTUsers { get; set; }
public DbSet TPTStudents { get; set; }
public DbSet TPTTeachers { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Foo");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("TPTUsers");
modelBuilder.Entity()
.HasKey(p => p.Id);
modelBuilder.Entity()
.Property(p => p.Id)
.ValueGeneratedOnAdd()
.UseIdentityColumn();

modelBuilder.Entity().ToTable("TPTStudents");
modelBuilder.Entity().ToTable("TPTTeachers");
}
}
Я пытаюсь добавить 2 экземпляра TPTStudent с PK, имеющим значение (это просто случайное целочисленное значение). Первоначально наше приложение генерирует модель на стороне клиента, и по умолчанию она имеет значение в PK.
Это код для добавления TPTStudent:

Код: Выделить всё

static void Main(string[] args)
{
using (var context = new TestContext())
{

var std = new List
{
new TPTStudent()
{
Id = 422,
Username = Guid.NewGuid().ToString("N"),
Email = Guid.NewGuid().ToString("N"),
CGPA = Guid.NewGuid().ToString("N"),
Major = Guid.NewGuid().ToString("N")
},
new TPTStudent()
{
Id = 412,
Username = Guid.NewGuid().ToString("N"),
Email = Guid.NewGuid().ToString("N"),
CGPA = Guid.NewGuid().ToString("N"),
Major = Guid.NewGuid().ToString("N")
}
};

context.TPTStudents.AddRange(std);
context.SaveChanges();
}
}
После нажатия SaveAsync возвращается эта ошибка:

Код: Выделить всё

Cannot insert explicit value for identity column in table 'TPTUsers' when IDENTITY_INSERT is set to OFF
Я знаю, что причина этой проблемы заключается в том, что EF Core предполагает, что если вы установите значение ключа, то это значение ключа этого объекта.
Моя главная цель — успешно добавить эти объекты, а EF Core игнорирует значение свойства Id. Значения для Id должны генерироваться в базе данных, поскольку в ее столбце установлено значение IDENTITY.
Я пробовал использовать ValueGeneratedOnAdd,

Код: Выделить всё

UseIdentityColumn
, устанавливаю для IsTemporary значение true (перед SaveChanges), но ничего из этого не работает.
Если то, чего я хочу достичь, невозможно, то это мое последнее средство будет такой подход.
EDIT: я нашел этот вопрос SO, и это именно то, что мне нужно. Кто-нибудь знает, как реализовать это в EF Core v6?

Подробнее здесь: https://stackoverflow.com/questions/726 ... t-approach
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как отслеживать историю обновлений объектов TPT в EF Core с MySQL [дублировать]
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как отслеживать историю обновлений объектов TPT в EF Core с MySQL [дублировать]
    Anonymous » » в форуме MySql
    0 Ответы
    112 Просмотры
    Последнее сообщение Anonymous
  • Как отслеживать историю обновлений объектов TPT в EF Core с MySQL [дублировать]
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Проблема с поиском объекта с помощью ID при использовании подхода реле
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Проблема с поиском объекта с помощью ID при использовании подхода реле
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»