我正在开发 ASP.NET Core 2.2 项目,并使用 Entity Framework Core 2.2 作为访问 Azure SQL 数据库的 ORM。
我有以下两个彼此相关的实体/表(一对多关系)。
[Table("Users")]
public class UserEntity : BaseGuidEntity
{
.../// other properties
[ForeignKey("Language")]
public int LanguageId { get; set; }
public virtual UserLanguageEntity Language { get; set; }
}
[Table("UserLanguages")]
public class UserLanguageEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
..//other properties
public virtual ICollection<UserEntity> Users { get; set; }
}
我已经在数据库中插入了两种不同的语言。这两种是唯一可用的语言,不允许插入新的语言。我使用以下代码插入具有相关语言的新用户:
var language = _languageRepository.GetById(newUser.Language.Id);
newUser.LanguageId = language.Id;
newUser.Language = language;
_userRepository.Insert(newUser);
所以,我基本上也想使用相关的现有语言创建一个新用户。但是 Entity Framework 核心尝试的是使用已经存在的值创建一个新的语言实体,这当然会导致 SQL 数据库中的错误。
Error: System.Data.SqlClient.SqlException (0x80131904): Cannot insert explicit value for identity column in table 'UserLanguages' when IDENTITY_INSERT is set to OFF.
如何将现有语言记录与新用户实体相关联?
最佳答案
您是否尝试过不设置newUser.Language?既然您已经设置了 LanguageId,那么您就没有理由这样做。您的 GetById 方法 _languageRepository.GetById(newUser.Language.Id);
可能已处理上下文,而 Insert 方法正在注册您正在设置的 Language 对象并尝试插入它。
以下是我在通用存储库中检索实体的方法,也许这可以帮助您:
public IEnumerable<T> FindBy(Expression<Func<T, bool>> whereCondition, params Expression<Func<T, object>>[] includes)
{
IQueryable<T> query = _dbContext.Set<T>().Where(whereCondition);
if (includes.Any())
return Includes(includes, query);
return query;
}
protected IQueryable<T> Includes(Expression<Func<T, object>>[] includes, IQueryable<T> query)
{
return includes.Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
}
然后你可以像这样使用它:
FindBy(r => r.Id == id, incl => incl.Languages)
关于c# - 为什么 Entity Framework Core 2.2 C# 在使用现有嵌套实体插入新实体时会响应错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57474530/