私はEntity Frameworkコアを勉強しています。私は2つの簡単なクラス:Country
とCurrency
を持っています。通貨は、国(フランス、ドイツ、イタリアなどはすべてユーロ通貨を共有)と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}");
みましたの選択 –