【问题标题】:Foreign key relationship, related object not storing properly in DbContext?外键关系,相关对象未正确存储在 DbContext 中?
【发布时间】:2012-12-06 09:07:16
【问题描述】:

尽管我对 .NET 堆栈完全陌生,但我还是设法开发了一个涉及以下技术的小型 N 层应用程序:

WPF -> WCF -> 实体框架 -> SQL Server

我的疑问主要是关于实体框架如何管理导航属性的分配。我将把我的数据合约代码放在一起,让球滚起来……

[DataContract]
public class Problem
{
    [DataMember]
    public int ProblemId { get; set; }

    [DataMember]
    public String Title { get; set; }

    [DataMember]
    public String Description { get; set; }

    [DataMember]
    public int WorkerId { get; set; }

    [DataMember]
    public int WorkId { get; set; }

    [DataMember]
    [ForeignKey("WorkerId")]        
    public virtual Worker Worker { get; set; }

    [DataMember]
    [ForeignKey("WorkId")]        
    public virtual Work Work { get; set; }
}


[DataContract]
public class Worker
{
    [DataMember]
    public int WorkerId { get; set; }

    [DataMember]
    public String Name { get; set; }    

    [DataMember] 
    public virtual ICollection<Problem> Problems { get; set; }        
}


[DataContract]
public class Work
{
    [DataMember]
    public int WorkId { get; set; }

    [DataMember]
    public String Name { get; set; }      

    [DataMember] 
    public virtual ICollection<Problem> Problems { get; set; }
}

在我的 Seed 方法中,我正在执行以下操作:

Work Work1 = new Work()
                                {
                                    WorkId = 1,
                                    Name = "Work1"
                                };

        Worker emp1 = new Worker()
                                {
                                    WorkerId = 1,
                                    Name = "Worker1"
                                };

        Problem Problem1 = new Problem()
                            {
                                ...
                                WorkId = 1,
                                WorkerId = 1
                            };

        Problem Problem2 = new Problem()
                              {
                                  ...
                                  Work = Work1,
                                  Worker = emp1
                              };

        //add objects to the context
        context.Works.Add(Work1);
        context.Workers.Add(emp1);
        context.Problems.Add(Problem1);
        context.Problems.Add(Problem2);

        //added just for testing
        Problem1.Work = Work1;
        Problem1.Worker = emp1;

        //finally: save changes           
        context.SaveChanges();

重点是:在处理上下文并执行如下查询后:context.Problems.ToList() ...问题1 和问题2 都将其导航属性(Worker,Work)分配给Null。 WorkerId 和 WorkId 被存储,但问题实体中没有它的相关对象。

我错过了什么吗?

非常感谢您的回答!

【问题讨论】:

  • 请注意,我正在以两种不同的方式创建“问题”对象(通过 ID 和导航属性直接分配其相关的 Work&Worker)。这不是一个错字,或错误,或其他什么。我只是想检测为什么会发生这种情况,并且使用两种初始化“问题”的方法......结果是一样的! ;)

标签: c# wpf wcf entity-framework


【解决方案1】:

是的,你需要这样做

context.Problems.Include(p=>p.Work).ToList() 

以便在您在新上下文下重新加载子项时填充它们。

【讨论】:

  • 非常感谢贾斯汀!我试过了,但得到一个“无法将 lambda 表达式转换为类型'字符串',因为它不是委托类型”:S
  • 啊,我知道那是什么,你需要补充一下:using System.Data.Entity
  • 哇,你就是贾斯汀!现在工作正常。这对我从 WPF 客户端进行数据绑定有很大帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多