2017-02-10 18 views
0

私はEntity Frameworkコアを勉強しています。私は2つの簡単なクラス:CountryCurrencyを持っています。通貨は、国(フランス、ドイツ、イタリアなどはすべてユーロ通貨を共有)と1対多の関係にある必要があります。Entity Framework Core Fluent APIを使用して1対多のリレーションシップを構成する方法

流暢なAPIのみを使用し、データ注釈は使用しません。目標は、LINQを使用して、MYSQLデータベースに格納されているCountryオブジェクトの通貨名を取得することです。

私は私のクラスを定義した:

public class Country 
{ 
    public string CountryID {get; set;} // ISO3166, "US" for United States 
    public string CurrencyID {get; set;} // ISO4217 "USD" for US Dollar 
    public string Name {get; set;} 

    public virtual Currency Currency {get; set;} 

    public Country() {}; 
} 

public class Currency 
{ 
    public string CurrencyID {get; set;} // ISO4217 
    public string Name {get; set;} 

    public virtual ICollection<Country> Countries {get; set;} 

    public Currency(){}; 
} 

私はDBContext

public DbSet<Country> Countries {get; set;} 

public DbSet<Currency> Currencies {get; set;} 

で私DBSetsオブジェクトを定義し、私は私のデータを定義するために流暢なAPIを使用します。

// Country 

modelBuilder.Entity<Country>().HasKey(c => new { c.CountryID }); 
modelBuilder.Entity<Country>().Property(c => c.CountryID).IsRequired(); 
modelBuilder.Entity<Country>().Property(c => c.CountryID).HasMaxLength(2); 
modelBuilder.Entity<Country>().Property(c => c.Name).IsRequired(); 
modelBuilder.Entity<Country>().Property(c => c.Name).HasMaxLength(50); 
modelBuilder.Entity<Country>().Property(c => c.CurrencyID).IsRequired(); //Foreign Key 
modelBuilder.Entity<Country>().Property(c => c.CurrencyID).HasMaxLength(3); //Foreign Key 

// Currency 

modelBuilder.Entity<Currency>().HasKey(c => new { c.CurrencyID }); 
modelBuilder.Entity<Currency>().Property(c => c.CurrencyID).IsRequired(); 
modelBuilder.Entity<Currency>().Property(c => c.CurrencyID).HasMaxLength(3); 
modelBuilder.Entity<Currency>().Property(c => c.Name).IsRequired(); 
modelBuilder.Entity<Currency>().Property(c => c.Name).HasMaxLength(70); 

その後デフォルトのデータをいくつか作成しました:

using (var dbContext = ContextFactory.Create(connectionString)) 
{ 
      { 
    dbContext.Add(new Country(iso3166Code: "FR", name: "France", iso4217Code: "EUR")); 
    dbContext.Add(new Country(iso3166Code: "DE", name: "Germany", iso4217Code: "EUR")); 
    dbContext.Add(new Country(iso3166Code: "IT", name: "Italy", iso4217Code: "EUR")); 
    dbContext.Add(new Country(iso3166Code: "US", name: "United States of America", iso4217Code: "USD")); 
    dbContext.Add(new Currency(iso4217Code: "EUR", name: "Euro")); 
    dbContext.Add(new Currency(iso4217Code: "USD", name: "US Dollar")); 

    dbContext.SaveChanges(); 
} 

データがMYSQLデータベースに保存されており、サーバーが動作していると確信しています。私は、データベースに接続することができますが、私はしようとすると:

var italyCurrencyName = context.Countries.First(c => c.CountryID == "IT").Currency.Name; 
WriteLine($"Italy currency is: {italyCurrencyName}"); 

私は例外を取得:Object reference not set to an instance of an objectを。その理由は、CountryオブジェクトのCurrencyナビゲーションプロパティがnullであるように見えるためです。

次のコードは、CurrencyIDとして設定された「EUR」(外部キー)で、右の国のオブジェクトを取得しますが、Currencyプロパティがnullです。

var italy = context.Countries.First(c => c.CountryID == "IT"); 

私は成功せず、このような関係を指定しようとしました:私は

modelBuilder.Entity<Country>().HasOne(e => e.Currency).WithMany(e => e.Countries).HasForeignKey(e => e.CurrencyID); 
modelBuilder.Entity<Currency>().HasMany(e => e.Countries); 

何をしないのですか?

UPDATE

var italy = context.Countries.First(c => c.CountryID == "IT"); 
var euro = context.Currencies.First(c => c.CurrencyID == "EUR"); 
WriteLine($"Italy currency is: {italyCurrencyName}"); 
+0

みましたの選択 –

答えて

0

あなたがnull値を取得する理由は、「遅延ロード」ではないということです。

私は通貨DbSetを強制的にロードする場合にのみ、私のデータを取得することができます

https://docs.microsoft.com/en-us/ef/core/querying/related-data

あなたが使用する必要があり、関連するデータを取得するには:まだEntity Frameworkのコアでサポートされています「積極的なロード」:あなたは

var italy = context.Countries.Include(c=>c.Currency).First(c => c.CountryID == "IT"); 
+0

は、[OK]を、私は、このリンクをチェックしてください@NicolaPrada –

+0

@NicolaPradaを試してみましょうながら(「通貨」)を含めます。それはEFコアに含まれていると言います。 https://docs.microsoft.com/en-us/ef/core/querying/related-data –

+0

この質問を確認するhttp://stackoverflow.com/questions/38044451/entity-framework-core-eager-loading-それでコレクションに含めて –

関連する問題