私は最初にコードでEFを少し試しています。私はどこに間違っているのか分かりません。私はちょうどアイデアがなくなり、私が間違っている場所を釘付けにしたいと思っています...TPHシンプルな設定/ディスクリミネータの問題
最初に場所を表すPOCOクラス - 場所は、RadioStation、またはMerchantです。私は追加のフィールドを追加していません(これは後で来ます)。今は単純な設定でTPHを作っています。
namespace EFDataClasses.Entities
{
public class RadioStation : Location
{
public RadioStation()
{
}
}
public class Merchant : Location
{
public Merchant()
{
}
}
public class Location
{
public Location()
{
}
public int Loc_ID { get; set; }
public string Loc_Code { get; set; }
public string Loc_Name { get; set; }
public string Loc_Type {get;set;}
}
}
その後、Configクラス:ここ
namespace EFDataClasses.Mapping
{
public class LocationMap : EntityTypeConfiguration<Location>
{
public LocationMap()
{
// Primary Key
this.HasKey(t => t.Loc_ID);
// Properties
this.Property(t => t.Loc_ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Properties
this.Property(t => t.Loc_Code)
.IsRequired()
.HasMaxLength(50);
this.Property(t => t.Loc_Name)
.IsRequired()
.HasMaxLength(50);
this.Property(t => t.Loc_ID).HasColumnName("Loc_ID");
this.Property(t => t.Loc_Code).HasColumnName("Loc_Code");
this.Property(t => t.Loc_Name).HasColumnName("Loc_Name");
//my discriminator property
this.Property(t => t.Loc_Type).HasColumnName("Loc_Type").HasColumnType("varchar").HasMaxLength(50).IsRequired();
// Table & Column Mappings
this.Map(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("Location");
}
)
.Map<RadioStation>(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("RadioStation");
}
)
.Map<Merchant>(m =>
{
m.ToTable("Location");
m.Requires("Loc_Type").HasValue("Merchant");
}
)
;
}
}
}
はコンテキストです..ラジオ局を追加しようと
namespace EFDataClasses
{
public class MyContext : DbContext
{
static MyContext()
{
Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());
}
public DbSet<EFDataClasses.Entities.Location> Locations {get; set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new LocationMap());
}
}
}
、最終的にはプログラムのクラス
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EFConsole
{
class Program
{
static void Main(string[] args)
{
var db = new EFDataClasses.MyContext();
db.Locations.Add(new EFDataClasses.Entities.RadioStation() { Loc_Name = "Radio Station Name 1", Loc_Code = "RD1" });
int chngs = db.SaveChanges();
System.Diagnostics.Debugger.Break();
}
}
}
私はエラーですLoc_Typeの検証エラーです。必須フィールドです。私の印象は、適切なタイプを選択したときにEFがそれを記入することです。
私は、適切な場所の種類を追加した場合は - EFは私に別のエラーを与える....
arggghhhを!
最終的に私はLocation Abstractを作成したいと思いますが、それは私がhasvalue( "Location")を削除できるということですか?
私はここに進んでいきたいと思いますが、私が間違っていた場所は不思議です。ありがとう!
私はあなたが正しいところにいると思いますが、どうしてEFにマッピングファイルに各サブクラスの値を伝えてから、Loc_Typeのプロパティをオーバーライドする必要があるのか混乱していますか?私は、弁別子フィールドの名前とサイズを制御したいと思っています。 – codeputer
Loc_Typeプロパティをオーバーライドする必要はありません。私はあなたがその財産の価値を望むならば、それを示していただけです。 discriminatorフィールドのサイズを設定する場合は、マップ呼び出しでそれを行います。私はこれを表示するために私の答えを更新します。 –
ここでの私の大きな混乱は、FKの分野に貢献し、リレーションシップに流暢なAPIを使用していることを実感しました。この場合、クラスのFKフィールドをマッピングしますが、識別器の場合はFKフィールドをマッピングしません。私はこのような理由から弁別者をクラスから削除することは考えていませんでした。これはAPI設計の不一致であると私には思われます。どう思いますか? – codeputer