实体框架:属于多个

本文关键字:属于 框架 实体 | 更新日期: 2023-09-27 17:59:22

我有三个模型:商店、员工、工作订单

商店有许多员工和许多工单。一切都很好,直到我想让工作订单属于商店,同时让一名员工负责完成它。

namespace TicketSystem.Models
{
    public class WorkOrder
    {
        public virtual int WorkOrderId { get; set; }
        public virtual int ShopId { get; set; }
        public virtual string Description { get; set; }
        public virtual Shop Shop { get; set; }
        // this breaks it:
        public virtual int EmployeeId { get; set; }
        public virtual Employee Employee { get; set; }
    }
}

我得到以下错误作为结果:

An exception of type 'System.Data.SqlClient.SqlException' occurred in EntityFramework.dll but was not handled in user code
Additional information: Introducing FOREIGN KEY constraint 'FK_dbo.WorkOrders_dbo.Shops_ShopId' on table 'WorkOrders' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

这里真正的问题是:发生这种情况是因为设计不好吗?我希望能够按商店和员工列出工作订单。

实体框架:属于多个

是!你说的是,一个员工有很多工作订单,一个商店有很多员工和很多工作订单。正如你所看到的,EF变得非常困惑。

我会正常化为单亲/子女关系,然后从那里开始。如果你从WorkOrder中删除ShopId,你仍然可以通过员工找到哪些工作订单属于哪些商店:

var workOrderId = 1;
var shop = context
     .Shops
     .Include("Employees")
     .Include("WorkOrders")
     .First(x => x.Employees.Any(e => e.WorkOrders.Any(w => w.WorkOrderId == workOrderId)));

没有必要在工单中重复该员工。