在EF6中,如何在1到多个SQL表关系之上将c#模型用于1-1关系

时间:2017-06-01 14:27:40

标签: c# sql-server entity-framework

首先,在Entity Framework 6代码中,我可以将哪些属性添加到我的C#对象模型中,以获得1-1父/子关系,而基础SQL表关系是1到多?

数据分为所有客户共有的数据和SQL Server 2012中特定客户的数据。

它有三个实体,一个WarehouseBase基础实体,WarehouseCustom客户特定数据和一个客户实体。

C#对象:

Warehouse
{
  public Guid ID {get;set;}
  public string Name {get;set;}
  public string Note {get;set;}  //customer specific data
}

Customer
{ 
  public Guid ID {get;set;}
  public string Name {get;set;}
}

客户用户将使用此工作流程:

  1. 客户在浏览器中查看Warehouse XYZ。它应该返回仓库XYZ共享数据(ID,Name)和客户特定数据(注意)。
  2. 客户编辑记事并点击保存按钮
  3. 注意应保存到数据库
  4. 管理员可以编辑和保存WarehouseBase数据(名称),但不能保存客户特定数据。

    SQL表:

    WarehouseBase
      ID : Guid
      Name: Nvarchar (255)
    
    WarehouseCustom
      ID : Guid
      WarehouseBaseID: GUID
      CustomerID : GUID
      Note : Nvarchar (255)
    
    Customer
      ID : Guid
      Name : Nvarchar (255)
    

    系统有多个不同的并发客户使用Web浏览器前端连接到WebAPI服务器。服务器使用EF6 / C#来访问SQL Server。

    可以为C#模型添加哪些属性?

    已经看过:

    1. 一对多关系:http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx
    2. 如何查询一对多并加载特定的子数据:Entity Framework include filter child collection

1 个答案:

答案 0 :(得分:0)

c#应该是

Warehouse {
    public Guid ID {get;set;}
    public string Name {get;set;}

    public ICollection<WarehouseCustom> CustomersNotes {get; set;}
}

Customer { 
    public Guid ID {get;set;}
    public string Name {get;set;}

    public ICollection<WarehouseCustom> WarehouseNotes {get; set;}
}

WarehouseCustom {
    public Guid ID {get;set;}
    public string Note {get;set;}  //customer specific data

    public virtual Warehouse {get; set;}
    public virtual Customer {get; set;}
}

因此,客户可以访问仓库中的所有笔记,仓库管理员可以访问所述仓库中的所有笔记。

为了防止客户在仓库的客户备注中导航,您必须注意数据的具体化。

using (AppContext ctx = new AppContext()) {
    return ctx.Customers.
        Include(x => x.WarehouseNotes.Select(y => y.Wharehouse)).
        Where(x => x.ID == oneID).
        ToList();
}

那就是:不要使用懒散的装载。

在代码示例中,您只加载客户应该看到的内容。

理想情况下,tou应使用DTO类型。

BTW:您不需要Warehousecustom的ID(如果您可以为一个仓库提供多个客户备注,则为execpt)。您可以使用由仓库ID和客户ID组成的复杂密钥。

恕我直言,这最后一个约束将强制你命名为1对1的关系。