EF Core не перестает отслеживать элемент списка внешних ключейC#

Место общения программистов C#
Ответить
Anonymous
 EF Core не перестает отслеживать элемент списка внешних ключей

Сообщение Anonymous »

Пытаюсь отредактировать объект офиса, и это отлично работает во всем, за исключением случаев, когда отредактированный офис передает меньше идентификаторов salesPerson ID, чем было раньше. Если идентификаторов меньше, их также следует удалить из списка внутри базы данных, в настоящее время он этого не делает. Однако новые идентификаторы добавляются правильно, если вы передаете больше идентификаторов, которых раньше не было.

Код: Выделить всё

public async Task EditOfficeAsync(OfficeEditDTO editedOffice)
{
var office = await dbContext.Offices.Include(o => o.Address)
.Include(o => o.SalesPeople)
.FirstOrDefaultAsync(o => o.Id == editedOffice.Id);

if (office == null)
return null;

var selectedSalesPeopleIds = office.SalesPeople.Select(o => o.Id).ToList();

if (editedOffice.Name != null)
office.Name = editedOffice.Name;

if(editedOffice.Address != null)
{
if (editedOffice.Address.AddressLine != null)
office.Address.AddressLine = editedOffice.Address.AddressLine;

if (editedOffice.Address.PostalCode != null)
office.Address.PostalCode = editedOffice.Address.PostalCode;

if (editedOffice.Address.City != null)
office.Address.City = editedOffice.Address.City;

if (editedOffice.Address.Country != null)
office.Address.Country = editedOffice.Address.Country;
}

if (!new HashSet(editedOffice.SalesPeopleIds).SetEquals(selectedSalesPeopleIds))
office.ReplaceSalesPeople(await dbContext.SalesPeople.Where(s => editedOffice.SalesPeopleIds.Contains(s.Id)).ToListAsync());

await dbContext.SaveChangesAsync();

return new OfficeDTO(
office.Id,
office.Name,
new AddressDTO(
office.Address.Id,
office.Address.AddressLine,
office.Address.PostalCode,
office.Address.City,
office.Address.Country
),
office.SalesPeople.Select(s => new SalesPersonDTO(s.Id, s.Name)).ToList()
);
}
В офисе:

Код: Выделить всё

private List _salesPeople = [];

public IReadOnlyCollection SalesPeople
{
get => _salesPeople.AsReadOnly();
init => _salesPeople = Guard.Against.NoDuplicatesAndNotNull(value).ToList();
}

public void ReplaceSalesPeople(IEnumerable salesPeople)
{
Guard.Against.NoDuplicatesAndNotNull(salesPeople);

_salesPeople.Clear();
_salesPeople.AddRange(salesPeople);

}
Я даже пытался установить для них значение null, но это не помогло?

Код: Выделить всё

public void ReplaceSalesPeople(IEnumerable salesPeople)
{
Guard.Against.NoDuplicatesAndNotNull(salesPeople);

var salesPeopleToRemove = _salesPeople.Where(s => !salesPeople.Any(ns => ns.Id == s.Id)).ToList();

foreach (var salesPerson in salesPeopleToRemove)
{
salesPerson.Office = null;
}
_salesPeople.Clear();
_salesPeople.AddRange(salesPeople);

}
Что я могу сделать, чтобы EF Core правильно отслеживал/отключал связь между офисом и продавцом?


Подробнее здесь: https://stackoverflow.com/questions/792 ... -list-item
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»