2016-10-24 1 views
0

2つのクラス間に1対多の関係を作成する必要があります。データベースにはプライマリまたは外部キーが含まれていません。このようにしてキーなしで既存のデータベースビューに1対多の関係をマッピングする

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; } 
} 

(データベーススキーマの変更が許可されていない)ので、私は代わりに3つのテーブルの2つのビューを作成することを決めた、とビューも何のプライマリ/外部キーを持っていない、私が使用することをしようと試みました何かのような

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

システムに変更を加える必要がありますが、変更は許可されていませんか? – GuidoG

+0

私はシステムで変更を行う必要はありません、私が必要なのはちょうどいくつかの選択をすることです。 – zxyzxy

答えて

0

テーブルに外部キーが含まれていないため、エラーが発生しました。外部キー属性は、データベースにそのような関係がないために役立ちません。

Entity FrameworkなどのORMを使用している場合、解決策はストアドプロシージャを作成し、EFで処理するようにすることです。

もう一つの方法は、特定の読み取り、書き込み、などによってSystem.Data.SqlClientからのクラスを使用して、独自のビジネス・ロジックを実装するために..です

だから私は、このような運動は、あなたの簡単な状況では必要ないことを考えます。しかし、テーブルを変更することなくこのまっすぐな道を歩いているなら、数多くの文書の準備ができています。

+0

そうではなく、私はsmth differentをすることにしました: – zxyzxy

0

SKUBarcodeビューの間に1対多の関係を作成できると思います。テーブルの場合と同じように、1つのSKUに多くのバーコードがあるビューです。 SKUとバーコードの間に1対多の関係を設定するには、流暢APIを使用します。

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; } 
} 
+0

私はこのようなエラーになります – zxyzxy

+0

追加情報:式 't => t.Barcodes'は有効なプロパティ式ではありません。式はプロパティを表す必要があります。C#: 't => t.MyProperty' VB.Net: 'Function(t)t.MyProperty'。 – zxyzxy

+0

同じエラーが発生し、問題が見つかりました。私はそれがあらかじめコードをテストしていないために得るものだと思う。 'public virtual ICollection バーコード;' to 'public ICollection バーコード{get;セット; } '。それはそのエラーを取り除くでしょう。しかし、もう1つのことをする必要があるか、別のエラーが発生します。コメントアウト 'public string _SkuId {get;セット; } 'プロパティを' Barcode'部分クラスから削除します。 'OnModelCreating'メソッドが' _SkuId'を外部キーとして設定するので、あなたはそれを必要としません。私は私の答えを更新します。 – kimbaudi

関連する問題