如何在EF 4.1代码优先中建立外键关系

本文关键字:建立 关系 代码 EF | 更新日期: 2023-09-27 17:49:38

所以我整个上午都在纠结这个问题。我读了一些文章,我的工作大致基于这一篇:

http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

这是我当前的错误:

在序列化类型为"system . data . entity . dynamicagents . order_c00ce366506bd8c6592a3cf21b9d1c5921d31c03d7322a8f6e8ead72e113ea95"的对象时检测到循环引用。

下面是类:

public class Order
{
    [Key]
    public int OrderId { get; set; }
    public int PatientId { get; set; }
    public virtual Patient Patient { get; set; }
    public int CertificationPeriodId { get; set; }
    public virtual CertificationPeriod CertificationPeriod { get; set; }
    public int AgencyId { get; set; }
    public virtual Agency Agency { get; set; }
    public int PrimaryDiagnosisId { get; set; }
    public virtual Diagnosis PrimaryDiagnosis { get; set; }
    public int ApprovalStatusId { get; set; }
    public virtual OrderApprovalStatus ApprovalStatus { get; set; }
    public int UserId { get; set; }
    public virtual User Approver { get; set; }
    public int SubmitterId { get; set; }
    public virtual User Submitter { get; set; }
    public DateTime ApprovalDate { get; set; }
    public DateTime SubmittedDate { get; set; }
    public Boolean IsDeprecated { get; set; }
}

我假设我已经做了一些"流畅的API。"不幸的是,我对fluent API并不熟练,所以我想验证一下,这实际上就是所缺少的。

谢谢,

圭多

如何在EF 4.1代码优先中建立外键关系

你需要使用ForeignKeyAttribute来修饰你的外键属性

我的第一直觉是[DataContract(IsReference=true)]。这将检测循环引用,并防止它们在对象图中无休止地循环。您可能需要用这个属性和命名参数IsReference来修饰您定义的一个或多个类。谷歌一下DataContractAttribute和IsReference,看看这篇文章和答案。

关于外键的建立,我认为您只需将ForeignKey属性应用到正确的字段/属性中,正如@Ken已经提到的。

Ladislav在评论中回答了这个问题:

你是否使用任何类型的序列化?WCF吗?这是最可能是异常的来源。- - - - - -Ladislav Mrnka 1小时前

另一个绕过循环引用的选项是禁用代理创建。你必须更明确地使用急切加载的导航属性,但它会停止延迟加载循环。

http://blogs.msdn.com/b/adonet/archive/2011/02/02/using-dbcontext-in-ef-feature-ctp5-part-8-working-with-proxies.aspx