【问题标题】:Two to many relationship in ASP.Net MVC EFASP.Net MVC EF 中的二对多关系
【发布时间】:2018-02-15 11:42:01
【问题描述】:

我是第一次使用 EF,在 2 个实体之间建立二对多关系时遇到了麻烦。

这两个实体是“客户”和“订单”。

一个客户有很多订单。 一个订单有两个客户:一个开票客户和一个交货客户。

这是我的模型:

客户

public class Customer
{
    [Required]
    public int CustomerID { get; set; }
    [Required(ErrorMessage = "Le code client est obligatoire.")]
    public string Code { get; set; }
    [Required(ErrorMessage = "La raison sociale est obligatoire.")]
    [StringLength(35, ErrorMessage = "La raison sociale ne peut excéder 35 caractères.")]
    public string CompanyName { get; set; }
    public bool IsExported { get; set; }

    public virtual ICollection<Order> Orders { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}

订购

public class Order
{
    [Required]
    public  int OrderID { get; set; }
    [Required]
    [ForeignKey("InvoicedCustomer")]
    public int InvoicedCustomerID { get; set; }
    [Required]
    [ForeignKey("DeliveredCustomer")]
    public int DeliveredCustomerID { get; set; }
    [Required]
    public int PaymentTermsID { get; set; }
    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
    public DateTime OrderDate { get; set; }
    [Required]
    public string OrderRef { get; set; }
    public bool IsExported { get; set; }

    public virtual ICollection<OrderLine> OrderLines { get; set; }
    public virtual Customer InvoicedCustomer { get; set; }
    public virtual Customer DeliveredCustomer { get; set; }
    public virtual PaymentTerms PaymentTerms { get; set; }
}

我能够创建一个订单,并且在创建时设置了 InvoicedCustomer 和 DeliveredCustomer。

但我无法访问 Customer.Orders,我了解我的做法,EF 认为订单仅属于一个客户,并且该客户未设置为创建订单。

我不想在这些实体之间设置多对多关系,因为一个订单只有 2 个客户。

我正在寻找一种在客户视图中访问 Customer.Orders 的方法,我不知道该怎么做。

我试过这个:

在客户控制器中

var orders = db.Orders.Where(o => o.InvoicedCustomer == customer
                                          || o.DeliveredCustomer == customer).ToList();
        customer.Orders = orders;

在 Views.Customer.Details 中

@foreach (var item in Model.Orders)
{
    <div class="row">
        <div class="col-md-3">
            <dl class="dl-horizontal">
                <dt>Référence</dt>
                <dd>@Html.DisplayFor(modelItem => item.OrderRef)</dd>
                <dt>Client facturé</dt>
                <dd>@Html.DisplayFor(modelItem => item.InvoicedCustomer.CompanyName)</dd>
                <dt>Client livré</dt>
                <dd>@Html.DisplayFor(modelItem => item.DeliveredCustomer.CompanyName)</dd>
            </dl>
        </div>
    </div>
    <hr />
}

不幸的是,这不起作用。

假设 InvoicedCustomer 和 DeliveredCustomer 都必须可以访问订单,有什么想法可以访问客户的订单吗?

我希望我的问题很详细。 谢谢!

【问题讨论】:

  • 你说这行不通?您是否收到错误或任何异常?这可能是一个问题,因为您指定了 2 个外键并且 EF 可能会感到困惑,但我需要看到错误才能知道 :)

标签: c# asp.net-mvc entity-framework


【解决方案1】:

在 Customer 类中创建 2 个集合(两个 1 对多关系)并添加 InversePropertyAttribute

[InverseProperty("InvoicedCustomer")]
public virtual ICollection<Order> InvoicedOrders { get; set; }

[InverseProperty("DeliveredCustomer")]
public virtual ICollection<Order> DeliveredOrders { get; set; }

如果您需要一个属性中的所有产品,请添加具有未映射属性的集合:

[NotMapped]
public IEnumerable<Order> Orders => this.InvoicedOrders.Concat(this.DeliveredOrders);

【讨论】:

  • 你好阁楼!是否有 2 步答案或 2 种可能的方法?我认为这是两种可能的方式,但我不确定。
  • 这是两步答案(第二步是可选的),我删除了误导性数字。
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多