簡體   English   中英

實體框架 - 外鍵屬性在 db.SaveChanges() 之后未更改;

[英]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屬性是表示UserCategory實體之間關系的導航屬性,但它不表示數據庫中的列。

你需要添加這一行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM