EF Core добавляет столбец дискриминатора к собственному объекту - PullRequest
0 голосов
/ 22 февраля 2019

Таким образом, у моей сущности есть два свойства с собственностью.По какой-то причине 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, за исключением этого странного элемента:

enter image description here

Это также приводит к сбою кода во время выполнения с этим сообщением:

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, столбец дискриминатора исчезнет ?

enter image description here

Почти незнакомо то, что когда я пытаюсь воспроизвести его с именем, утвержденным в небольшом тесте, я все еще не получаю различениетам есть столбец инатора.


Обновление 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; }

1 Ответ

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

Хотя я не до конца понимаю проблему (из-за изменения названия проблема исчезла), я заметил, что проблема на самом деле не решается.Скорее просто переместил это.Комментарий от @philreed выше был тем, что действительно заставило его щелкнуть.

AuditInfo было унаследовано другим владельцем ClosurePart.При переходе с

public class AuditInfo {
...props here
}

public class ClosurePart : AuditInfo {}

на

public class AuditInfoCommon {
...props here
}

public class AuditInfo : AuditInfoCommon {}

public class ClosurePart : AuditInfoCommon {}

Проблема полностью исчезла без необходимости взлома.

ПРИМЕЧАНИЕ: AuditInfoCommon не отображается в модели!

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