Entity Framework Add () обновляется вместо вставки - PullRequest
1 голос
/ 27 марта 2019

У меня есть следующая функция для добавления объекта в базу данных:

public void AddEnterpriseShare(Objects.FinancialTransactionEnterpriseShare share)
{
    _services.DbContext.FinancialTransactionEnterpriseShares.Add(share);
    _services.DbContext.SaveChanges();
}

Я называю это следующим образом:

foreach (var enterprise in model.Enterprise)
{
    Service.FinancialTransactionServices.AddEnterpriseShare(new Data.Objects.FinancialTransactionEnterpriseShare()
    {
       ProfitLossId = profitLoss.Id,
       EnterpriseId = enterprise.Id,
       Percentage = enterprise.Percent,
       FinancialTransactionId = transaction.Id
   });
}

Этот цикл должен выполняться 6 раз и добавлять 6 новых записей в базу данных, по одной для каждого идентификатора. Если я покажу этот код, то увижу, что запись создается в базе данных ... затем во второй раз в цикле обновляется исходная запись, а не вставляется вторая запись!

Почему я вижу это поведение?

Класс сущности выглядит следующим образом:

public class FinancialTransactionEnterpriseShare
{
    public int Id { get; set; }
    public int ProfitLossId { get; set; }
    public int EnterpriseId { get; set; }
    public decimal Percentage { get; set; }
    public int FinancialTransactionId { get; set; }

    public ProfitLoss ProfitLoss { get; set; }
    public Enterprise Enterprise { get; set; }
    public FinancialTransaction FinancialTransaction { get; set; }
}

migrationBuilder.CreateTable(
            name: "FinancialTransactionEnterpriseShares",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                EnterpriseId = table.Column<int>(nullable: false),
                FinancialTransactionId = table.Column<int>(nullable: false),
                Percentage = table.Column<decimal>(nullable: false),
                ProfitLossId = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_FinancialTransactionEnterpriseShares", x => x.Id);
                table.ForeignKey(
                    name: "FK_FinancialTransactionEnterpriseShares_Enterprises_EnterpriseId",
                    column: x => x.EnterpriseId,
                    principalTable: "Enterprises",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.NoAction);
                table.ForeignKey(
                    name: "FK_FinancialTransactionEnterpriseShares_FinancialTransactions_FinancialTransactionId",
                    column: x => x.FinancialTransactionId,
                    principalTable: "FinancialTransactions",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.NoAction);
                table.ForeignKey(
                    name: "FK_FinancialTransactionEnterpriseShares_ProfitLosses_ProfitLossId",
                    column: x => x.ProfitLossId,
                    principalTable: "ProfitLosses",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.NoAction);
            });

        migrationBuilder.CreateIndex(
            name: "IX_FinancialTransactionEnterpriseShares_EnterpriseId",
            table: "FinancialTransactionEnterpriseShares",
            column: "EnterpriseId");

        migrationBuilder.CreateIndex(
            name: "IX_FinancialTransactionEnterpriseShares_FinancialTransactionId",
            table: "FinancialTransactionEnterpriseShares",
            column: "FinancialTransactionId",
            unique: true);

        migrationBuilder.CreateIndex(
            name: "IX_FinancialTransactionEnterpriseShares_ProfitLossId",
            table: "FinancialTransactionEnterpriseShares",
            column: "ProfitLossId");

1 Ответ

1 голос
/ 28 марта 2019

Благодаря комментариям Ивана Стоева, приведенным выше, я нашел проблему.

Класс FinancialTransaction содержит ссылку на класс FinancialTransactionEnterpriseSplit - эта ссылка была установлена ​​как 1: 1, а не как 1: *. В результате этого при создании поле FinancialTransactionId создавалось с уникальным флагом, установленным в значение true.

Обновление кода для использования ICollection<FinancialTransactionEnterpriseSplit> в FinancialTransaction решило проблему, вызвав правильное создание поля.

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