繁体   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