.net 实体框架-在db.SaveChanges()之后未更改外键属性;

ia2d9nvy  于 2023-01-03  发布在  .NET
关注(0)|答案(3)|浏览(119)

我有一个数据库(代码第一)与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>();
}

为什么会这样?
起初,我有代码,不工作标记为在第一个例子。
经过修改,我纠正了错误,我的代码工程标记为第二个例子.
我只想知道原因。

j2cgzkjk

j2cgzkjk1#

您的第一个代码不起作用,因为Category属性是一个导航属性,它表示UserCategory实体之间的关系,但不表示数据库中的列。
需要在第一个代码中添加userEntity.CategoryId = categoryEntity.CategoryId;这一行

rdlzhqv9

rdlzhqv92#

我认为您需要在保存更改之前将更改附加到DBContext,如下所示:

_context.Users.Attach(your_modifed_user_object);

通过这样做,您告诉实体框架(EF)您的对象有了新的更改,EF将能够“跟踪”更改以生成正确的SQL命令。
注意,您需要使用Attach,因为您的用户对象是数据库中的现有对象,因此EF需要跟踪它。
有关Attach的更多信息,请访问:https://learn.microsoft.com/en-us/ef/ef6/saving/change-tracking/entity-state#attaching-an-existing-entity-to-the-context

cczfrluj

cczfrluj3#

对于那些好奇的人

我的问题是我的模特。
我将用户模型类更改为:

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; }

现在,我的模型包含了可以设置的CategoryId。对该属性的更改会更改整个Category属性。我的工作代码现在是:

db.Entry(model).Entity.CategoryId = model.Category.CategoryId;
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();

相关问题