我有一个数据库(代码第一)与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>();
}
为什么会这样?
起初,我有代码,不工作标记为在第一个例子。
经过修改,我纠正了错误,我的代码工程标记为第二个例子.
我只想知道原因。
3条答案
按热度按时间j2cgzkjk1#
您的第一个代码不起作用,因为
Category
属性是一个导航属性,它表示User
和Category
实体之间的关系,但不表示数据库中的列。需要在第一个代码中添加
userEntity.CategoryId = categoryEntity.CategoryId;
这一行rdlzhqv92#
我认为您需要在保存更改之前将更改附加到DBContext,如下所示:
通过这样做,您告诉实体框架(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-contextcczfrluj3#
对于那些好奇的人
我的问题是我的模特。
我将用户模型类更改为:
现在,我的模型包含了可以设置的CategoryId。对该属性的更改会更改整个Category属性。我的工作代码现在是: