实体框架5.0关系

时间:2013-02-05 03:59:50

标签: entity-framework

我有以下Customer课程:

public class Customer : EntityBase<Customer>
{
    public virtual int ID { get; set; }
    public virtual CustomerType CustomerType { get; set; }

    public virtual string CompanyName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public virtual ICollection<Address> BillingAddresses { get; set; }
    public virtual ICollection<Address> ShippingAddresses { get; set; }
}

Address类看起来像这样:

public class Address : EntityBase<Address>
{
    public virtual int ID { get; set; }
    public virtual AddressType AddressType { get; set; }
    public virtual bool IsDefault { get; set; }
    public virtual string Name { get; set; }
    public virtual string Line1 { get; set; }
    public virtual string Line2 { get; set; }
    public virtual string Line3 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
    public virtual string ZipCode { get; set; }
    public virtual string Country { get; set; }

    public virtual int CustomerID { get; set; }
    public virtual Customer Customer { get; set; }
}

我希望能够在客户类中拥有多种类型的地址,但我很难搞清楚这一点。

我想最终得到这样的东西,以获得每种类型的默认地址。

public Address DefaultBillingAddress
{
    get
    {
        return BillingAddresses.First(x => x.IsDefault == true);
    }
}

我遇到的问题是如何区分每个AddressTypeICollection枚举的区别?

1 个答案:

答案 0 :(得分:1)

您正在以两种不同的方式捕捉“地址类型”的概念。

AddressType上有Address枚举,您还有单独的

public virtual ICollection<Address> BillingAddresses { get; set; }
public virtual ICollection<Address> ShippingAddresses { get; set; }

这个模型当然可以在BillingAddresses中使用AddressType.Shipping结束,反之亦然。

我建议将对象模型简化为

public virtual ICollection<Address> Addresses { get; set; }

并在Customer上提供辅助方法,分别从地址返回结算和送货地址。

话虽如此,我不确定你的意思

  

我遇到的问题是如何区分每个ICollection上的AddressType枚举?

每个ICollection都应引用相同的AddressType枚举。

使用我建议的方法,你可以写

public Address DefaultBillingAddress
{
    get
    {
        return Addresses
         .First(x => x.IsDefault == true && x.AddressType == AddressType.Billing);
    }
}