![](/img/trans.png)
[英]Db.SaveChanges Not Assigning Primary Key ID After Insert - Code First Entity Framework
[英]Entity Framework - foreign key property not changed after db.SaveChanges();
我有一個數據庫(代碼優先),其中包含 2 個表用戶和類別。 每個用戶都被分配到一個類別:
此代碼有效:
User userEntity = db.Users.FirstOrDefault(u => u.UserId == model.UserId);
Category categoryEntity = db.Category.FirstOrDefault(c => c.CategoryId == model.Category.CategoryId);
userEntity.Category = categoryEntity;
db.SaveChanges();
此代碼不起作用:
db.Entry(model).Entity.Category.CategoryId = model.Category.CategoryId;
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
我的DbContext
是:
public DbSet<User> Users { get; set; }
public DbSet<Category> Category { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().HasRequired<Category>(s => s.Category);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
這是為什么?
起初我的代碼不能像第一個例子中那樣工作。
更改后,我更正了錯誤,我的代碼被標記為第二個示例。
我只想知道原因。。
我認為您需要在保存更改之前將更改附加到您的 DBContext,如下所示:
_context.Users.Attach(your_modifed_user_object);
通過這樣做,您告訴實體框架 (EF) 您的 object 有一個新的更改,EF 將能夠“跟蹤”更改以生成正確的 SQL 命令。
請注意,您需要使用Attach
,因為您的用戶 object 是數據庫中現有的 object,因此 EF 需要對其進行跟蹤。
有關Attach
的更多信息: https://learn.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state#attaching-an-existing-entity-to-the-context
您的第一個代碼不起作用,因為Category
屬性是表示User
和Category
實體之間關系的導航屬性,但它不表示數據庫中的列。
你需要添加這一行userEntity.CategoryId = categoryEntity.CategoryId;
在你的第一個代碼中
User 實體中沒有 CategoryId 屬性。 有 Category 屬性,指的是 Category 實體。 代碼 1(使用 userEntity 的地方)運行良好,無需更改任何內容。 代碼 2 不起作用,這是必須更改的代碼。
對於那些好奇的人。
我的問題是我的 model。
我將我的用戶 model class 更改為:
public int UserId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string Contact { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
現在我的model里面有CategoryId,可以設置。 對此屬性的更改會更改整個類別屬性。 我的工作代碼現在是:
db.Entry(model).Entity.CategoryId = model.Category.CategoryId;
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.