[英]Entity Framework Code First Updating Record is Not Saving Parent
我下面的代码可以很好地保存记录,但不能保存客户端。 我没有收到错误,它将记录保存到数据库,但是没有与父客户端建立关系。 在调试的同时,我逐步确保var client实际上包含一个client对象。
很感谢任何形式的帮助!
无论如何,这是我的代码:
using (var context = new TDBContext())
{
if (SelectedProject != null)
{
var client = (from x in context.Clients
where x.ID == (Guid) comboClient.SelectedValue
select x).FirstOrDefault();
Project project = new Project()
{
ID = (Guid) SelectedProject,
ProjectCode = textProjectCode.Text,
Client = client,
ProjectStart = dateProjectStart.SelectedDate,
Active = checkActive.IsChecked
};
context.Projects.Attach(project);
context.Entry(project).State = EntityState.Modified;
context.SaveChanges();
}
else
{
MessageBox.Show("Project ID not loaded!", "Error!", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
项目实体:
public Project()
{
}
[Key]
public Guid ID { get; set; }
public string ProjectCode { get; set; }
public Client Client { get; set; }
public DateTime? ProjectStart { get; set; }
public bool? Active { get; set; }
客户实体:
public Client()
{
}
[Key]
public Guid ID { get; set; }
public string ClientName { get; set; }
public byte[] ClientLogo { get; set; }
public ICollection<Project> Projects { get; set; }
您必须分配ClientId列,而不仅仅是Client引用。 EF足够聪明,可以检查ClientId是否存在并且具有与客户端导航属性不同的ID,但是,如果ID为空,它将完全忽略该客户端导航属性。
编辑
嗯,然后调用context.Projects.Add(project)而不是将其更改为Modified。
编辑(最终使其正常工作):
我创建了一个单独的方法来更新客户端。 我从我的主要保存方法调用此方法。 现在每次都可以使用。 我确信我可以做得更好(即所有方法都相同):
private void SaveClient()
{
using (var context = new PDBContext())
{
var client = (from x in context.Clients
where x.ID == (Guid) comboClient.SelectedValue
select x).FirstOrDefault();
var project = (from x in context.Projects
where x.ID == SelectedProject
select x).FirstOrDefault();
project.Client = client;
context.Projects.Attach(project);
context.Entry(project).State = EntityState.Modified;
context.SaveChanges();
}
PopulateClientCombo();
}
对于您是否使用EF,我不太确定,但我会尽力解决这个问题。 请注意,这是与您完全不同的方法。 简而言之,我将创建/获取客户ID并将其添加到要添加的新Project对象中。
向您的项目实体添加更多属性: public Guid ClientId { get; set; }
public Guid ClientId { get; set; }
public Guid ClientId { get; set; }
。 这与public Client Client { get; set; }
public Client Client { get; set; }
public Client Client { get; set; }
。 当您应用迁移时,您的Project表现在具有ClientId来引用Client(一对多关系,不是吗?)
应用迁移,并确保表本身具有引用。
在您的方法中,在创建新项目时添加ClientId。 这应该足够了。
Project project = new Project() { ID = (Guid) SelectedProject, ProjectCode = textProjectCode.Text, ClientId = (Guid)comboClient.SelectedValue, // Your client's Guid. Make sure this record exists in the database. ProjectStart = dateProjectStart.SelectedDate, Active = checkActive.IsChecked };
这就是我通常在项目中所做的事情。 查询时 ,您加载数据,并且EntityFramework具有为您执行此操作的方法。 另请参阅: 加载相关数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.