如何在EF 4.1 Code First中建立外键关系

时间:2011-04-07 20:16:53

标签: c# entity-framework code-first

所以我整个上午一直在努力争取这个。我已经阅读了一些文章,而且我的工作大致基于这一篇:

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.DynamicProxies.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; }
}

我假设我已经使用“Fluent API”做了一些事情。遗憾的是我不熟悉Fluent API,因此我想验证这实际上是缺少的。

谢谢,

4 个答案:

答案 0 :(得分:5)

您需要使用ForeignKeyAttribute来装饰您的外键属性。

答案 1 :(得分:0)

我的第一个直觉在[DataContract(IsReference=true)]给了我。这将检测循环引用并防止它们在对象图中无限循环。您可能需要使用此属性和命名参数IsReference来装饰您定义的一个或多个类。在DataContractAttribute和IsReference上获取谷歌并阅读this post和答案。

关于外键的建立,我想你只需将ForeignKey属性应用于正确的字段/属性@Ken已经提到过。

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

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

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