将一对多关系映射到没有键的现有数据库视图

时间:2016-10-24 14:07:21

标签: c# sql-server entity-framework

我需要在两个类之间创建一对多关系。数据库不包含主键或外键。所以我决定创建2个视图而不是3个表,并且视图也没有主键/外键(不允许更改数据库模式)

Views

[Table("Barcode")]
public partial class Barcode
{
    [Column("_Barcode")]
    public string _Barcode { get; set; }

    [Column("_SkuRef")]
    [MaxLength(16)]
    public byte[] _SkuRef { get; set; }

    [Key]
    [Column("Id")]
    public long Id { get; set; }

    public string _SkuId { get; set; }
}


[Table("SKU")]
public partial class SKU
{
    [Column("_Code", Order = 0)]
    [StringLength(11)]
    public string _Code { get; set; }

    [Column("_Description", Order = 1)]
    [StringLength(150)]
    public string _Description { get; set; }

    [Column("_ProductId", Order = 2)]
    [StringLength(50)]
    public string _ProductId { get; set; }

    [Column("_Ref", Order = 3)]
    [MaxLength(16)]
    public byte[] _Ref { get; set; }

    [Key]
    [Column(Order = 4)]
    [StringLength(36)]
    public string Id { get; set; }
}

通过这种方式,我尝试使用像

这样的东西
using (SkuContext db = new SkuContext())
        {

            var Skutable = db.SKUs;
            foreach(var s in Skutable)
            {

                Console.WriteLine(s.Id);
            }
        } 

它运作良好。但是当我试图添加

 public partial class Barcode
 {
  ....
    [ForeignKey("_SkuId")]
    [Column("_SkuId")]
    [StringLength(36)]
    public string _SkuId { get; set; }
 }
 public partial class SKU
 {
  ....
    public IEnumerable<Barcode> Barcodes;
 }

我正面对 “属性'_SkuId'无法配置为导航属性”错误。 我的问题是如何做正确的事情?如何在这两个类之间建立关系?

2 个答案:

答案 0 :(得分:0)

您收到错误,因为您的表不包含外键。外键属性不会导致您在数据库中没有这种关系。

如果您正在使用ORM,例如Entity Framework,那么解决方案将是编写存储过程并使EF与其一起使用。

另一种方法是使用System.Data.SqlClient中的类通过特定的阅读,写作等来实现自己的业务逻辑。

所以我认为在你的简单情况下不需要这样的练习。但如果你只是以这种直接的方式进行,而不更换表格,那就准备好了大量的文档。

答案 1 :(得分:0)

我认为您可以在SKUBarcode视图之间创建一对多关系,其中一个SKU具有多个条形码,就像它是表格时一样。使用Fluent API配置SKU和条形码之间的一对多关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // one-to-many relationship
    // _SkuId foreign key in Barcode
    modelBuilder.Entity<Barcode>()
        .HasRequired(c => c.SKU)
        .WithMany(t => t.Barcodes)
        .Map(m => m.MapKey("_SkuId"));

}

更新您的课程,如下所示:

[Table("Barcode")]
public partial class Barcode
{
    [Column("_Barcode")]
    public string _Barcode { get; set; }

    [Column("_SkuRef")]
    [MaxLength(16)]
    public byte[] _SkuRef { get; set; }

    [Key]
    [Column("Id")]
    public long Id { get; set; }

    // need to comment this out
    //[Column("_SkuId")]
    //[StringLength(36)]
    //public string _SkuId { get; set; }


    public virtual SKU SKU { get; set; }
}

[Table("SKU")]
public partial class SKU
{
    [Column("_Code", Order = 0)]
    [StringLength(11)]
    public string _Code { get; set; }

    [Column("_Description", Order = 1)]
    [StringLength(150)]
    public string _Description { get; set; }

    [Column("_ProductId", Order = 2)]
    [StringLength(50)]
    public string _ProductId { get; set; }

    [Column("_Ref", Order = 3)]
    [MaxLength(16)]
    public byte[] _Ref { get; set; }

    [Key]
    [Column(Order = 4)]
    [StringLength(36)]
    public string Id { get; set; }

    public virtual ICollection<Barcode> Barcodes { get; set; }
}