3

2 つの列を持つ従来のデータベースがあり、それらを 1 つの ID としてマップしたいのですが、これは可能です

例えば

    public class Product
{ 
public string ProductID {get;set;}
public string ShortDescription {get;set;}
public string UserName {get;set;}
}

次に、私のModelbinderは次のようになります

modelBinder.Entity<Product>().
HasKey(p=>p.ProductID)
.MapSingle(product =>
new {
 colShotDesc = product.ShortDescription,
 colUser = product.UserName
}
).ToTable("Products");

私が必要とするのは、マッピングの ProductID = ShortDescription + UserName のようなものです...これらの2つの列は一意のキー制約を共有しているため...

これが意味をなすかどうかはわかりませんが、提案は素晴らしいでしょう...データベースの設計について尋ねないでください=>これはそのままであり、変更すべきではありません...だから私はEFコードファーストができると思ったのです助けてください(クロスフィンガーを願っています)...データベースにはpkが定義されていないように見えるため、一意のキー制約だけが定義されています...

とにかく...助けは素晴らしいだろう..

4

2 に答える 2

11

複合型が必要であり、プロパティ名の末尾にIDを追加する規則を使用して、複合型をキーとして認識したいようです。

EF CFは、現時点ではそれを行うことができません。

Key属性またはFluentAPIを使用して、複合キーについてEFCFに通知できます。

データ注釈:

public class Product 
{  
  [Key, Column(Order=0)]
  public string ShortDescription {get;set;} 
  [Key, Column(Order=1)]
  public string UserName {get;set;} 
}

流暢なAPI:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.Entity<Product>()
               .HasKey(p=> new{p.ShortDescription, p.UserName});
}

コードで使用できる複合型を作成して、コードを概念的に機能させたい方法で機能させることができます。

public class Product 
{  
  public ProductID Key {get;set;}
}

public class ProductID 
{
  public string ShortDescription {get;set;} 
  public string UserName {get;set;} 
}

次に、FluentAPIを使用してマップします。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  modelBuilder.ComplexType<ProductID>()
               .Property(p=>p.ShortDescription)
               .HasColumnName("ShortDescription")
               .Property(p=>p.UserName)
               .HasColumnName("UserName");
}

または、データ注釈を使用する場合:

[ComplexType]
public class ProductID
{
  [Column("ShortDescription")]
  public string ShortDescription {get;set;} 
  [Column("UserName")]
  public string UserName {get;set;} 
}

列名を指定する必要があります。そうしないと、構成で列名がProductID_ShortDescription...であると想定されます。

複合型に関する詳細情報は次のとおりです。

于 2011-04-16T01:09:49.457 に答える
0

実際には、単一の概念プロパティをいくつかのストレージ列にマップする必要があります。列の値をプロパティに連結するコードがありますが、これまでのところ問題ありません。
しかし、コンテキストに新しいエンティティを追加するプロセスを想像してみましょう。そのため、プロパティの値を設定しました。EF は、このプロパティの値を両方の列に書き込むルールをどのように知る必要がありますか?
このシナリオを実装できるかどうかはわかりません。

于 2010-08-04T16:09:35.587 に答える