簡體   English   中英

實體框架代碼首次更新記錄未保存父級

[英]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對象中。

  1. 向您的項目實體添加更多屬性: 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(一對多關系,不是嗎?)

  2. 應用遷移,並確保表本身具有引用。

  3. 在您的方法中,在創建新項目時添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM