【发布时间】:2018-02-11 14:29:24
【问题描述】:
让我通过一个例子来解释我的问题:
我有以下实体:
public class Project
{
public int ProjectId { get; set; }
public string ProjectName { get; set; }
public int? BranchId { get; set; }
public virtual Branch Branch { get; set; }
}
public class Branch
{
public int BranchId { get; set; }
public string BranchName { get; set; }
public virtual ICollection<Project> Projects { get; set; }
public Branch()
{
Projects = new ObservableCollection<Project>();
}
}
我的 DbContext 为:
public class MyContext : DbContext
{
public DbSet<Project> Projects { get; set; }
public DbSet<Branch> Branches { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Branch>().HasMany<Project>(b => b.Projects).WithOptional(p => p.Branch).HasForeignKey(p => p.BranchId);
}
}
从不同的上下文中添加/更新/删除分支和项目实体。项目在没有分支的情况下存在,但经过一些工作流程后,项目需要从给定的分支列表中附加到一个分支。
如果我试试这个,效果很好:
private void ForeignKeyTest()
{
using (var db = new MyContext())
{
var project = db.Projects.Find(1);
project.BranchId = 8;
db.SaveChanges();
var msg = project.Branch.BranchName; //call to the Branch after save
MessageBox.Show(msg);
}
}
但是,如果我尝试这个,我会得到一个 NullReference 异常:
private void ForeignKeyTest()
{
using (var db = new MyContext())
{
var project = db.Projects.Find(1);
project.BranchId = 8;
var msg = project.Branch.BranchName; //call to the Branch before save
db.SaveChanges();
MessageBox.Show(msg);
}
}
现在,我知道这是一种预期行为,因为 Project 的 Branch 属性未初始化。 但我的问题是,如何在保存项目之前获取 BranchId 后强制更新分支(此时仍保留与项目的一些处理,因此不能仅保存到分支)。希望我清楚地解释自己。
【问题讨论】:
标签: entity-framework ef-code-first dbcontext