2016-06-24 9 views
0

親愛なる仲間のプログラマー、一対一のデータベースまずEF

私はEF内のこの基本的な考え方にこだわっているとstackoverflowの上の任意の解決策を見つけることができません。

FluxLocationとAddressの間に1対1のオプションの関係が必要です。 (通常の単語:物理アドレスに磁束位置を与えることができます)

データベースはすでに存在し、最終的です。

SQLのTABLES:

CREATE TABLE sales.sales_flux_location(
id serial PRIMARY KEY, 
-- Many unusefull properties 
sales_address_id integer REFERENCES sales_address 
); 

CREATE TABLE sales.sales_address(
id serial PRIMARY KEY, 
-- Many unusefull properties 
); 

EFマッピング:

public partial class FluxLocation 
{ 
    public int Id { get; set; } 

    //Many unusefull properties. 

    [ForeignKey("Address")] 
    public int? AddressId { get; set; } 
    public Address Address { get; set; } 
} 

internal partial class FluxLocationConfiguration : EntityTypeConfiguration<FluxLocation> 
{ 
    public FluxLocationConfiguration() 
    { 
     //PK 
     HasKey(x => x.Id); 
     ToTable("sales_flux_location", "sales"); 
     Property(a => a.Id) 
      .HasColumnName("id") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     //FK 
     HasOptional(l => l.Address) 
      .WithOptionalDependent(a => a.FluxLocation); 
     Property(l => l.AddressId) 
      .HasColumnName("sales_address_id") 
      .IsOptional(); 


    // + mapping other properties. 
} 

public partial class Address 
{ 
    public int Id { get; set; } 

    // other properties 

    public FluxLocation FluxLocation { get; set; } 
} 

internal partial class AddressConfiguration : EntityTypeConfiguration<Address> 
{ 
    public AddressConfiguration() 
    { 
     //PK 
     HasKey(a => a.Id); 
     ToTable("sales_address", "sales"); 
     Property(a => a.Id) 
      .HasColumnName("id") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     //FK 
     HasOptional(a => a.FluxLocation).WithOptionalPrincipal(l=>l.Address); 

     // mapping many unusefull properties 

} 

テストケース:Context.SaveChanges上

var dbAddress = Context.AddressSet.Add(new Address {Country = "BEL", CityName="Brussel", Street = Guid.NewGuid().ToString() }); 
var dbLocation = Context.FluxLocationSet.Add(new FluxLocation { AddressId = dbAddress.Id, Country = "BEL", Type = "MARKET", ExtId = Guid.NewGuid().ToString() }); 
Context.SaveChanges(); 

エラー():

"42703:リレーション\" sales_flux_location \ "の列\" Address_Id \ "は存在しません"}

これは、列名が "sales_address_id"なので正しいです。 なぜ誰かが彼がpropery columnnameマッピングを無視している理由を助けることができたら? 必要に応じてより多くのコードを提供しています。

答えて

1

EFは、sales_address_idをFKとして使用して、Address_Idを作成しようとしていません。また、EFは0:1ない方には、いくつかのすごみがある - 基本的にそのようにこれを試して1:M

でそれをだますする必要があります。もちろん

//FK 
HasOptional(l => l.Address) 
    .WithMany() 
    .HasForeignKey(d => d.AddressId); 

Link

+2

、それを拾っていない、そのどこにも設定されていない! EFは各対1対1関係を大会ごとにPK = FKとして実装するので、奇妙さは0:1関係だけでなく1:1でもある。あなたの提案されたソリューションは、この慣習を迂回する唯一の方法です。もう一方(WithRequired/WithOptionalはFKを宣言することができないので、私が気づいている以外の方法)は、Data Annotation ForeignKeyを使用することです。評論家はいませんが、この短い答えにはっきりしています。 – DevilSuichiro

+0

詳細な解決策をお寄せいただきありがとうございます。私は、このセットアップでEFをだますのは少し難しいと感じています。私はまだSteve Greeneとして1:mを使用するつもりですが、それをコレクションにマップし、無視するEF用の他のプロパティを作成してリストの最初のアイテムを返します。コードに制限を設ける。 –

関連する問題