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