实体框架.如何对没有主键的表进行右映射

本文关键字:映射 框架 实体 | 更新日期: 2023-09-27 18:14:52

我试过解决这个问题,但不行,所以我试着用另一种方法解决。

我有一个视图,包含3个表,没有任何主/外键。

VS2015生成了这个类:

[Table("SkuBarcodesView")]
public partial class SkuBarcodesView
{
    [Key]
    [Column("_Code", Order = 0)]
    [StringLength(11)]
    public string C_Code { get; set; }
    [Key]
    [Column("_Description", Order = 1)]
    [StringLength(150)]
    public string C_Description { get; set; }
    [Key]
    [Column("_ProductCode", Order = 2)]
    [StringLength(50)]
    public string C_ProductCode { get; set; }
    [Key]
    [Column("_Ref", Order = 4)]
    [StringLength(36)]
    public string C_Ref { get; set; }
    [Key]
    [Column("_Barcode", Order = 5)]
    public string C_Barcode { get; set; }
}

这个实体表示sku-barcode表所以我可以有这样的行:

 Product  | Barcode
 -------- | --------
 product0 | barcode0
 product1 | barcode1 
 product2 | barcode2
 product2 | barcode2

现在,我需要把它分组。我在:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews.GroupBy(e => e.C_Ref)
        .Select(g => new { Barcode = g.C_Barcode });
}

但是,然后我看到这个错误:

严重性代码描述项目文件行抑制状态

错误CS1061 'IGrouping'不包含'C_Barcode'的定义,并且无法找到接受类型'IGrouping'的第一个参数的扩展方法'C_Barcode'(您是否缺少using指令或程序集引用?)

我该如何解决这个问题?

这只是一个开始;有很多其他的表在数据库中没有键/外键,我想通过EF工作。

从没有键的表中获取数据的正确方法是什么?如何映射这样的表?

实体框架.如何对没有主键的表进行右映射

首先,这本身不是主键/外键问题。LINQ分组的工作方式不像通常的SQL分组,而更像Dictionary。对于您的示例,键为product2的组在表中的每次出现都有两个值barcode2。当我们在c#中操作对象时,每一行都由SkuBarcodesView实例表示,所以如果您想获得产品的所有条形码,则需要这样的东西:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews.GroupBy(e => e.C_Ref)
        .Select(g => new { 
                             Product = g.Key,
                             Barcodes = g.Select(x => x.C_Barcode) 
               });
}

请注意,目前对表中的值没有限制,因此一个产品可能有很多不同的条形码或很多相同的条形码等。你怎么知道哪一个是正确的?当然,如果您确定只有相似的条形码,您可以执行g.First().C_Barcode而不是上面代码中的内部g.Select()以获得单个条形码。

第二,在这里使用GroupBy()是多余的,你可以直接使用:

using (skumodel db = new skumodel())
{
    var query = db.SkuBarcodesViews
        .Select(x => new { Ref = x.C_Ref, Barcode = x.C_Barcode })
        .Distinct();
}