簡體   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