繁体   English   中英

为什么 Entity Framework Core 2.2 C# 在插入具有现有嵌套实体的新实体时响应错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM