Невозможно вставить значение для идентификатора в таблицу, когда для IDENTITY_INSERT установлено значение OFF - PullRequest
1 голос
/ 08 апреля 2019

Я получаю сообщение об ошибке выше, когда я звоню SaveChanges(), используя экземпляр моего Context. Теперь я понимаю, на что указывает ошибка, но я просто не понимаю, почему она возникает в данной конкретной ситуации.

Ошибка возникает из-за того, что я сохраняю экземпляр TestMember в поле TestMember в классе Report (который является моделью для моей таблицы). Поскольку TestMember является внешним ключом, это не должно быть проблемой, не так ли? Для собственной ясности я написал сырой SQL и явно поместил valid int в поле ForeignKey, и оно работало нормально. INSERT INTO [TestMemberReports].[dbo].[TestReports] (TestMemberId,Date,IsSuccess) values (3, '2019-05-09', 0).

Однако, когда сделано в коде, как показано ниже. Выдает ошибку SqlException: Cannot insert explicit value for identity column in table 'TestMembers' when IDENTITY_INSERT is set to OFF.. Для цели вопроса, пожалуйста, примите:

CreateReports() вызывается с main()

Код

public class TestReportService
{
    private TestMemberReportContext Context { get; }
    public void SaveChanges() => Context.SaveChanges();

    public TestReportService(TestMemberReportContext context)
    {
        Context = context;
    }

    public void CreateReports()
    {
        var reports = AddReport();
        Context.TestReports.Add(reports);
        SaveChanges();
    }

    private TestReport AddReport()
    {
        return new TestReport { IsSuccess = 0, TestMember = GetTestMember("Member 1"), Date = DateTime.Now() });            
    }

    public TestMember GetTestMember(string name)
    {
        return Context.TestMembers.Single(c => c.Name == name);
    }
}

Модель

public class TestReport
{
    public int Id { get; set; }
    public TestMember TestMember { get; set; }
    public DateTime Date { get; set; }
    public bool IsSuccess{ get; set; }
}

public class TestMember
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FileName { get; set; }
    public ICollection<TestRecipient> Recipients { get; set; }
}

1 Ответ

0 голосов
/ 20 мая 2019

Для любого, кто столкнется с этой ошибкой в ​​будущем, исправление использует другой тип шаблона для хранения внешних ключей.Используя профилировщик SQL, я определил, что когда я сохранял объект-член для использования в качестве FK в объекте Reports, EF Core фактически выполнял запрос INSERT для моей базы данных (отсюда и сообщение об ошибке, указывающее на таблицу, которая никогда не вызывается в коде).

Старая модель отчета

public class TestReport
{
    public int Id { get; set; }
    public TestMember TestMember { get; set; }
    public DateTime Date { get; set; }
    public bool IsSuccess{ get; set; }
}

Новая модель отчета

public class TestReport
{
    public int Id { get; set; }

    public int? TestMemberId { get; set; }

    [ForeignKey(nameof(TestMemberId))]
    public virtual TestMember TestMember { get; set; }

    public DateTime Date { get; set; }

    public bool IsSuccess { get; set; }
}

Таким образом, когда вы хотите сохранить TestMember объект в TestReport объект, вы просто сохраняете Id в поле TestMemberId. И всякий раз, когда вы хотите получить объект TestMember из объекта TestReport, вы просто используете Id в качестве предиката и используете.Include(x => x.TestMember) в вашем LINQ (если вы, очевидно, используете LINQ)

Надеюсь, это вам поможет!

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