Entity Framework Core - не удается добавить дочерние записи - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть родительские дочерние отношения, и я не могу использовать команду scaffolding в EF Core, потому что у дочерней таблицы нет ключа.Мне не разрешено добавлять ключи, поэтому я застрял в архитектуре.

Когда я сохраняю изменения, я получаю следующее внутреннее исключение: Неверное имя столбца 'NewBusinessMasterNbTransactionId'

Код в Startup.cs:

  public void ConfigureServices(IServiceCollection services)
  {
    var connection = Configuration.GetSection("SqlConnection1").Value;
    services.AddScoped<IDharma, DharmaRepo>();
    services.AddDbContext<DharmaContext>(options => options.UseSqlServer(connection));
  }

Код вDharmaContext (я удалил большую часть столбцов данных, чтобы сделать его короче):

 public partial class DharmaContext : DbContext
 {
    public DharmaContext()
    {
    }

    public DharmaContext(DbContextOptions<DharmaContext> options)
        : base(options)
    {
    }

    public virtual DbSet<NewBusinessMaster> NewBusinessMaster { get; set; }
    public virtual DbSet<NewBusinessDetail> NewBusinessDetail { get; set; }


    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasAnnotation("ProductVersion", "2.2.4-servicing-10062");
        modelBuilder.Entity<NewBusinessMaster>(entity =>
        {
            entity.HasKey(e => e.NbTransactionId);

            entity.ToTable("NewBusiness_Master");

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");

            entity.Property(e => e.NbLob)
                .HasColumnName("NB_LOB")
                .HasMaxLength(2)
                .IsUnicode(false);

        });

        modelBuilder.Entity<NewBusinessDetail>(entity =>
        {
            entity.HasKey(e => e.NbTransactionId);

            entity.ToTable("NewBusiness_Detail");

            entity.Property(e => e.NbTransactionId).HasColumnName("NB_TRANSACTION_ID");
        });
            entity.Property(e => e.NbAgentNumber)
                .IsRequired()
                .HasColumnName("NB_AGENT_NUMBER")
                .HasMaxLength(9)
                .IsUnicode(false);
     }
  }

Модели (я удалил большую часть столбцов данных, чтобы их было легче читать):

    public partial class NewBusinessMaster
    {
        public int NbTransactionId { get; set; }
        public string NbLob { get; set; }

        public List<NewBusinessDetail> NewBusinessDetail { get; set; }

        public NewBusinessMaster()
        {
            NewBusinessDetail = new List<NewBusinessDetail>();
        }

    }

    public partial class NewBusinessDetail
    {
        public int NbTransactionId { get; set; }
        public string NbAgentNumber { get; set; }
    }
}

Код для добавления и сохранения записей:

NewBusinessMaster nbMaster = new NewBusinessMaster();
nbMaster.NbLob = "AU";
NewBusinessDetail nbDetailItem = new NewBusinessDetail();
foreach (XElement item in screenH202.Descendants())
{
    nbDetailItem = new NewBusinessDetail();
    if (!string.IsNullOrEmpty(item.Value))
    {
        nbDetailItem.NbAgentNumber = nbMaster.NbAgentNumber;
    }
}
_context.NewBusinessMaster.Add(nbMaster);
 try
 {
    await _context.SaveChangesAsync(); //this line throws the error
 }
 catch (DbUpdateException dbEx)
 {
    throw;
 }

Скриншоты SQL:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 27 сентября 2019

По определению, «сущность» - это объект с идентификатором.Она называется Entity Framework по какой-то причине, это платформа для работы с объектами, что означает, что они должны иметь первичные ключи (идентификатор).

При этом может быть несколько вариантов.для вас здесь.Во-первых, EF Core поддерживает то, что он называет « принадлежащих объектам ».По сути, это объекты значения (объект, который получает свою идентичность из суммы своих значений, а не явный идентификатор, такой как адрес), и поэтому не имеют свойств явного идентификатора.Однако у них все еще есть первичный ключ, который является просто внешним ключом, устанавливающим отношения один-к-одному с сущностью, которая «владеет» ими.Я не уверен, как бы вы на самом деле помешали принадлежащему вам типу.Если у вас есть таблица, в которой внешний ключ также является первичным ключом, EF Core может экстраполировать его на принадлежащий ему тип, но для этого может потребоваться добавление первичного ключа в таблицу, если это не так.

Единственный другой вариант - это то, что EF Core называет типами запросов или типами объектов без ключа (имя изменилось в 3.0 на без ключа).Это в буквальном смысле таблицы или представления без первичного ключа или просто результаты чего-то вроде функции или хранимой процедуры, в точности соответствующие вашему сценарию.Однако их можно только прочитать, не вставить или изменить, что может не сработать для вашего сценария.Я также не уверен, как это можно сделать с помощью строительных лесов.Типы ключей не являются чем-то, что вы вручную добавляете в свой контекст, а не тем, что EF Core сгенерирует для вас.

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