Entity Framework SaveChanges не работает с некоторыми объектами

#c# #asp.net-mvc #entity-framework

#c# #asp.net-mvc #entity-framework

Вопрос:

У меня есть такая структура БД:

 User
Company
CompanyUser 
 

CompanyUser имеет UserId CompanyId столбец and и логическое значение.

Пользовательская сущность имеет этот элемент навигации:

 ICollection<CompanyUser> Companies
 

У компании есть этот элемент навигации:

 ICollection<CompanyUser> Users
 

CompanyUser выглядит так:

 public class CompanyUser : BaseEntity
{
    /// <summary>
    /// Gets or sets if the user is an admin
    /// </summary>
    public bool IsAdmin { get; set; }

    /// <summary>
    /// gets or sets the company id
    /// </summary>
    public Guid? CompanyId { get; set; }

    /// <summary>
    /// gets or set the user id
    /// </summary>
    public Guid? UserId { get; set; }

    public User User { get; set; }
    public Company Company { get; set; }       
}
 

Я могу создавать объекты a User и a Company , и они вставляются в базу данных. Но когда я создаю CompanyUser подобное, оно вообще не вставляется.

 User user = new User();
// Set properties
_userService.InsertUser(user);

Company company = _companyService.GetCompanyById(i);
CompanyUser companyUser = new CompanyUser()
{
    IsAdmin = true,
    CompanyId = company.Id,
    UserId = user.Id
};

_companyService.InsertCompanyUser(companyUser);
 

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

SaveChanges() возвращается 0 с каждым CompanyUser изменением, и Entities' счетчик всегда 0

Этот entity Framework бросал меня в течение последних нескольких часов, и я, кажется, не могу понять это. Что я делаю не так?

Обновить

Вот InsertCompanyUser

 try
{
    if (entity == null)
        throw new ArgumentNullException("entity");

    this.Entities.Add(entity); 
    this._context.SaveChanges();
}
 

this.Entities является ли IDbSet<T>

Мой контекст БД расширяет DbContext и имеет этот метод:

 public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
{
    return base.Set<TEntity>();
}
 

ОБНОВЛЕНИЕ 2

DbSet For CompanyUser всегда сохраняет значение 0 и никогда не увеличивается, но Company и User DbSet s увеличиваются, как и должны. Почему DbSet не увеличивается при вызове Add

Комментарии:

1. Я не думаю, что вам нужно устанавливать как Company, так и CompanyID, а также User и userId. Просто установите значения внешнего ключа для вставки и установите, будет ли он сохранен.

2. Да, я пробовал это. Я также попытался установить только навигационные свойства, и это никуда не делось.

3. Как выглядит ваш контекстный класс?

4. Я обновил свой вопрос, чтобы получить информацию о контексте и методе вставки

5. Мне интересно, имеет ли это какое-то отношение к Key атрибутам вашего CompanyUser объекта? Я предполагаю, что вы определяете Id в BaseEntity so, может ли это отбрасывать его, когда EF находит Id в качестве первичного ключа и находит CompanyId и UserId как составные ключи? Что произойдет, если вы Key полностью удалите атрибуты из UserId и CompanyId ?

Ответ №1:

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

 User user = new User();
// Set properties

Company company = _context.Companies.Find(i);
CompanyUser companyUser = new CompanyUser()
{
    IsAdmin = true,
    User = user
};

company.Users.Add(companyUser);
_context.SaveChanges();