[英]Why does Entity Framework Core 2.2 C# respond with an error while inserting a new entity with an existing nested entity
我正在处理一个 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);
所以,我基本上也想用相关的现有语言创建一个新用户。 但是实体框架的核心尝试,是用已经存在的值创建一个新的语言实体,这当然会导致 SQL db 中的错误。
错误:System.Data.SqlClient.SqlException (0x80131904):当 IDENTITY_INSERT 设置为 OFF 时,无法为表“UserLanguages”中的标识列插入显式值。
如何将现有语言记录与新用户实体相关联?
你有没有试过不设置 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.