Как мне сопоставить несколько вариантов сущностей с помощью одного и того же ключа - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть таблица и ее представление, и оба сопоставлены как отдельные объекты. У меня начинаются проблемы, когда я пытаюсь отобразить (сначала код) зависимые элементы как в таблицу, так и в представление при сохранении:

Referential integrity constraint violation. A Dependent Role has multiple principals with different values.

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

public class Sale 
{
    public long Id {get;set}
    public string Code {get;set;}
    public ICollection<SaleItem> Items {get;set;}
}

public class SaleView
{
    public long Id {get;set}
    public string SaleCode {get;set;}
    public decimal Total {get;set;}
    // I would like to add the items collection here too
    // public ICollection<SaleItem> Items {get;set;}
}

public class SaleItem 
{
     public long Id {get;set;}
     public decimal Price {get;set;}
     public string Title {get;set;}
     public long DocumentId {get;set;}
     public Sale Sale {get;set;}
     public SaleView View {get;set;}
}

//mappings
enter code here
public SaleItemMapping()
{                   
     HasKey(t => t.Id);     
     ToTable("saleitems", "public");
     Property(x=>x.DocumentId ).HasColumnName("documentid");
     // ...
     HasRequired(t => t.Sale).WithMany(t => t.Items).HasForeignKey(d => d.DocumentId );
     HasRequired(t => t.View).WithMany(t => t.Items).HasForeignKey(d => d.DocumentId );
}

Я хочу sh добавить элементы в представление, потому что я хочу отфильтровать SaleView по свойству Item. И это работает просто отлично:

var query = dbContext.SaleView.AsNoTracking().AsQueryable();
if(!string.IsNullOrEmpty(searchItem)
    query = query.Where(x=>x.Items.Any(i=> i.Title == searchItem)))
// apply other filters 

проблемы начинают появляться, когда я не ищу элементы, но когда я начинаю вставлять новый Sales. Я могу просто добавить один документ, но когда их два или более, я получаю ошибку выше.

Итак, в заключение я ищу ответы, как я могу отфильтровать строки SaleView по его связанные свойства объекта или исправьте сопоставление, чтобы я мог вставить новый Sales без ошибок.

В простом SQL я мог бы просто LEFT JOIN Items в SaleView и вообще без проблем .

PS Я не могу заставить сущность SaleView наследовать сущность Sale, они слишком разные. Мне было очень трудно найти решение самостоятельно, потому что код ошибки просто направлял меня к проблемам, когда люди непреднамеренно допускали ошибки отображения, ну, моя «ошибка» была преднамеренной.

...