Таким образом, у моей сущности есть два свойства с собственностью.По какой-то причине EF Core добавляет столбец дискриминатора к одному из них.Было бы замечательно, если бы кто-то мог помочь мне выяснить, что я делаю неправильно, или если здесь есть какая-то странная ошибка.
Это целое существо, хотя я подозреваю, что только Requested
и Approved
Соответствующий.
public class Absence
{
public Absence()
{
Requested = new AuditInfo();
Approved = new AuditInfo();
}
public Guid Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public AbsenceType Type { get; set; }
public AbsenceState State { get; set; }
public AuditInfo Requested { get; set; }
public AuditInfo Approved { get; set; }
public Guid EmployeeId { get; set; }
public Employee Employee { get; set; }
public ICollection<AbsenceDay> Days { get; set; }
}
Absence
не имеет каких-либо специальных сопоставлений, но AuditInfo сопоставляется как
x.Owned<AuditInfo>();
Это в основном генерирует ожидаемый SQL, за исключением этого странного элемента:
Это также приводит к сбою кода во время выполнения с этим сообщением:
Message: Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while updating the entries. See the inner exception for details.
---- System.Data.SqlClient.SqlException : Cannot insert the value NULL into column 'ApprovedA_Discriminator', table 'bokio-test.dbo.Absences'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Что я пробовал:
Я попытался сопоставить элементы, как это, без разницы:
x.Entity<Absence>().OwnsOne(x1 => x1.Approved);
x.Entity<Absence>().OwnsOne(x1 => x1.Requested);
Я попытался переименовать Approved
в ApprovedA
, что не имеет значения.
Затем я попыталсямаленькое репродуцирование, подобное этому, которое не создает столбец дискриминатора:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Address HomeAddress { get; set; }
public Address WorkAddress { get; set; }
}
Теперь у меня нет идей, и мне нужна помощь.
Обновление 1:
Держи свои шляпы, все будет очень странно!
Когда я переименую Approved
в Donkey
, столбец дискриминатора исчезнет ?
Почти незнакомо то, что когда я пытаюсь воспроизвести его с именем, утвержденным в небольшом тесте, я все еще не получаю различениетам есть столбец инатора.
Обновление 2:
Итак, я попробовал несколько других имен.Успех означает отсутствие столбца дискриминатора.
Xpproved = успех App = сбой Ap = сбой CrAp = успех A = сбой Axx = успех ApprovedXX = сбой XApproved = success
Это вдохновило меня попробовать это решение сX Утверждено, что работает
x.Entity<Absence>().OwnsOne(x1 => x1.XApproved, o =>
{
o.Property(x2 => x2.Ip).HasColumnName("Approved_Ip");
o.Property(x2 => x2.UserAgent).HasColumnName("Approved_UserAgent");
o.Property(x2 => x2.UserId).HasColumnName("Approved_UserId");
o.Property(x2 => x2.TimeUtc).HasColumnName("Approved_TimeUtc");
});
Обновление 3:
AuditInfo имеет только эти свойства и не имеет сопоставлений, кроме Owned
.У него есть несколько классов, наследующих его:
public DateTime TimeUtc { get; set; }
public Guid? UserId { get; set; }
public string Ip { get; set; }
public string UserAgent { get; set; }