Часть кода удалена для краткости.
Я создал веб-сайт ASP.NET Core MVC, используя Entity Framework Core.
У меня есть три таблицы для Parts
, Distributors
и DistributorParts
(таблица соединений). На моем сайте есть страница для добавления Distributors
к Part
. Когда я создаю новую запись DistributorPart
для Распространителя 1 и Части 1, запись вставляется правильно. Но когда я добавляю вторую запись DistributorPart
для Распространителя 2 и Части 1, первая запись DistributorPart
удаляется! (обратите внимание, что две вышеупомянутые записи DistributorPart
используют Часть 1)
Мои вопросы:
- Как я могу вставить новые
DistributorPart
записей, без удаления/изменения существующих записей? - Что я делаю не так?
Модели:
public class Part
{
[key]
public int Id { get; set; }
public string Description { get; set; }
public ICollection<DistributorPart> DistributorParts { get; set; }
}
public class Distributor
{
[key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public ICollection<DistributorPart> DistributorParts { get; set; }
}
public class DistributorPart
{
[key]
public int Id { get; set; }
public int OnHand { get; set; }
public int OnOrder { get; set; }
public int PartId { get; set; }
public Part Part { get; set; }
public int DistributorId { get; set; }
public Distributor Distributor { get; set; }
}
Вот мой DbContext
:
public class MyContext : DbContext
{
public DbSet<Part> Parts { get; set; }
public DbSet<Distributor> Distributors { get; set; }
public DbSet<DistributorPart> DistributorParts { get; set; }
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{ }
}
Вот код, который вставляет новую запись DistributorPart
:
public DistributorPart AddDistributorPart(DistributorPart distributorPart)
{
var newDistributorPart = new DistributorPart
{
OnHand = distributorPart.OnHand,
OnOrder = distributorPart.OnOrder,
PartId = distributorPart.PartId,
DistributorId = distributorPart.DistributorId
};
_context.Add(newDistributorPart);
_context.SaveChanges();
return newDistributorPart;
}
Я могу проверить это в окне вывода приложения при отладке:
Microsoft.EntityFrameworkCore.Database.Command:Информация: Выполнена команда DbCommand (1 мс) [Параметры=[@p0='?', @p1='?', @p2='?'], CommandType='Text', CommandTimeout=' 30'] УДАЛИТЬ ИЗ "DistributorParts", ГДЕ "Id" = @p0; ...
ИЗМЕНИТЬ:
Вот мой метод Controller, который вызывает метод AddDistributorPart():
public DistributorPart AddDistributorToPart([FromBody] DistributorPart distributorPart)
{
var part = _partService.GetPart(distributorPart.PartId);
if (part == null || part.Id <= 0)
{
throw new Exception($"Part Id of {distributorPart.PartId} does not exist.");
}
var distributor = _distributorService.GetDistributor(distributorPart.DistributorId);
if (distributor == null || distributor.Id <= 0)
{
throw new Exception($"Distributor Id of {distributorPart.DistributorId} does not exist.");
}
var userId = GetUserId();
var newDistributorPart = _distributorPartService.AddDistributorPart(distributorPart, userId);
...
return newDistributorPart;
}
DistributorParts
? Строки на самом деле в этой таблице? - person CodeNotFound   schedule 20.05.2018_context
, по-видимому, совместно используется разными вызовами (и даже разными репозиториями или любыми вспомогательными классами, которые вы используете, трудно сказать, где искать. Можете ли вы поставить точку останова перед строкой_context.Add(newDistributorPart);
и проверитьvar deletedEntries = _context.ChangeTracker.Entries().Where(e => e.Entity is DistributorPart && e.State == EntityState.Deleted).ToList();
и посмотреть, пуста ли она? - person Ivan Stoev   schedule 20.05.2018Add
, поэтому не должно быть сущности с состояниемAdded
. И никакихModified
илиDeleted
. Затем сделайте то же самое послеAdd
вызова. Просто пытаюсь выяснить, является ли методAdd
причиной странных вещей или есть что-то до этого :) - person Ivan Stoev   schedule 20.05.2018OnStateManagerChanged
добавьте точку останова с условиемentry.Entity is DistributorPart && entry.EntityState == EntityState.Modified
. При достижении точки останова изучите стек вызовов, чтобы увидеть, какой код вызывает это. - person Ivan Stoev   schedule 21.05.2018var part = _context.Parts.Where(p => p.Id == id).Include(p => p.DistributorParts).FirstOrDefault();
Я добавил 'Include()', чтобы он заполнил коллекцию/список DistributorParts. Когда я комментирую .Include(), он работает, как и ожидалось. Но с .Include() код отслеживания говорит, что DistributorParts находится в состоянии «Изменено». Есть идеи, что происходит, @IvanStoev? Спасибо еще раз!!! - person Dan   schedule 22.05.2018Include
не может переводить объект в измененное состояние. Я полагаю, что это происходит из-за какой-то другой операции. Попробуйте предложение из моего предыдущего комментария, стек вызовов действительно должен дать вам информацию о том, какая операция вызывает это. - person Ivan Stoev   schedule 22.05.2018