实体框架POCO - 建模0:1或1:1关系

时间:2013-11-13 20:49:18

标签: entity-framework

有人可以确认我已经编码了2个POCO类之间的正确关系,这样我就有了一个可以有0或1个CreditCard对象的Order对象和一个必须属于Order的CreditCard对象(为简洁起见,删除了一些类属性)

public class Order
{
    public int OrderId { get; set; }
    public string Username { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public decimal Total { get; set; }

    public CreditCard CreditCard { get; set; }
}

public class CreditCard
{
    public int CreditCardId { get; set; }
    public int OrderId { get; set; }
    public CardType Type { get; set; }
    public string Number { get; set; }

    public Order Order { get; set; }
}

在我的OnModelCreating方法中,我有以下内容:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>().HasOptional(or => or.CreditCard).WithRequired(lu => lu.Order);
}

希望上面的代码指定订单有可选的CreditCard,但信用卡需要订单。

2 个答案:

答案 0 :(得分:0)

在EF中,所有相关实体之间的1:1和1:0..1(甚至0..1:0..1)关系require that the primary key is shared。您的CreditCardIdOrderId值必须相同。

您的配置似乎正确指定了关系,但OrderId中的CreditCart属性是多余的,可能会导致问题。在CreditCard中,您可能需要将CreditCardId标记为不是由服务器生成的。

答案 1 :(得分:0)

如果您使用的是o / r映射器,例如Entity Framework或NHibernate,我会将其建模为一对多并使用公共属性将集合限制为一个项目(实际上我不知道是否可以在EF)。基本上,我将其视为1:n,其中n由业务规则设置。我不喜欢这个解决方案,但根据我的经验,这是建模它的最佳方式I haven't found a better solution in the last almost four years