c# - 为什么 Entity Framework Core 2.2 C# 在使用现有嵌套实体插入新实体时会响应错误

标签 c# .net sql-server asp.net-core entity-framework-core

我正在开发 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/

相关文章:

.net - 重用 SpecFlow 场景

sql - 如何使用下一行和上一行选择两个日期之间的行

sql-server - Windows 管理员没有 SQL Server 的权限

c# - 这个奇怪的属性 VB 语法的 c# 等价物是什么?

c# - Linq OrderBy 逻辑

c# - 调试在 Visual Studio 外部运行的应用程序

sql - 为什么 SSMS 中 "TRANSFER"呈蓝色?

c# - Nancy decimal 属性绑定(bind)不起作用

c# - SqlException 事务在通信缓冲区资源上被死锁

.net - 与 PostgreSQL 一起使用的 Mono ORM?