【发布时间】: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