用Code First定义ForeignKeys

时间:2013-05-25 11:33:07

标签: c# ef-code-first foreign-key-relationship

我正在尝试使用ForeignKeyAttribute定义2个表之间的关系。 我找到了几个网站,用ForeignKeyAttribute描述了一个有趣的方法。

以下是两个代码示例:

第一个:

public class Customer
{
    public int ID { get; set; }
    public int OrderID { get; set; }

    // Some other properties

    [ForeignKey("OrderID")]
    public virtual Order Order { get; set; }
}

public class Order
{
    public int ID { get; set; }
    public int CustomerID { get; set; }

    // Some other properties

    [ForeignKey("CustomerID")]
    public virtual Customer Customer { get; set; }
}

第二个:

public class Customer
{
    public int ID { get; set; }

    [ForeignKey("Order")]
    public int OrderID { get; set; }

    // Some other properties

    public virtual Order Order { get; set; }
}

public class Order
{
    public int ID { get; set; }

    [ForeignKey("Customer")]
    public int CustomerID { get; set; }

    // Some other properties

    public virtual Customer Customer { get; set; }
}

在第一个代码示例中,ForeignKeyAttribute位于public virtual Customer Customer { get; set; }

public int CustomerID { get; set; }(订单和客户ID)上的第二个代码示例中。

我的问题是,我如何知道在哪种情况下使用哪种方法?

我知道这也可以使用Fluent API来完成,但目前这个问题与此问题无关。

1 个答案:

答案 0 :(得分:0)

首先,只想说您不需要在任何属性上放置ForeignKey属性。只需执行以下操作即可:

public class Customer
{
    public int ID { get; set; }

    //EF will create the relationship since the property is named class+id
    //the following is not necessary, is just good practice
    //if this is omitted EF will create a Order_Id on its own
    public int OrderID { get; set; }

    // Some other properties

    public virtual Order Order { get; set; }
}

public class Order
{    
    public int ID { get; set; }

    // no need to include the id property
    // Some other properties

    public virtual Customer Customer { get; set; }
}

话虽如此,答案是ForeignKey构造接受一个字符串参数。如果将它放在外键属性上,它应该具有导航属性的名称,如果将它放在导航属性上,它应该具有外键的名称。放置的位置完全取决于您,只要您记住要使用的string值。