[英]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.