私は数時間前から検索していましたが、問題を見つけることができませんでした。Entity Frameworkはテーブルに冗長な重複ディスクリプタ列を追加します
私はEntity Framework Fluent ApiコードファーストTPHアプリケーションを構築しています。私はAdd-Migration EF addの「Type」列は問題ありませんが、Discriminatorの冗長列も追加します(「Type」で上書きする必要があります)。私はマップを使用してタイプの列名と可能な値を指定していますが、このアプローチはほとんどのドメインモデルでうまくいくようですが、これは冗長な第2の識別器列を取得します。 BondはドメインモデルのAssetから継承します。
HERESに私のコード:
public class BondConfiguration : EntityTypeConfiguration<Bond>
{
public BondConfiguration()
{
Property(b => b.IssueDate)
.HasColumnName("BondIssueDate")
.HasColumnType(DatabaseVendorTypes.TimestampField)
.IsRequired();
Property(b => b.MaturityDate)
.HasColumnName("BondMaturityDate")
.HasColumnType(DatabaseVendorTypes.TimestampField)
.IsRequired();
HasRequired(b => b.Currency).WithRequiredDependent();
Property(b => b.Coupon.Rate);
Property(b => b.Coupon.Amount);
Property(b => b.FaceValue)
.HasColumnName("BondFaceValue")
.IsRequired();
}
}
public class AssetConfiguration : EntityTypeConfiguration<Asset>
{
public AssetConfiguration()
{
Property(a => a.IsDeleted).HasColumnName("IsDeleted");
HasKey(a => a.Id);
ToTable("tbl_Asset");
Property(a => a.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.HasColumnName("AssetId");
Property(a => a.Name)
.HasColumnName("AssetName")
.IsRequired();
Property(a => a.Isin)
.HasColumnName("AssetISIN");
Map<Bond>(p => p.Requires("AssetClass").HasValue((int)AssetClass.Bond));
}
}
ドメインモデル:
public class Bond : Asset
{
public DateTime IssueDate { get; set; }
public DateTime MaturityDate { get; set; }
public BondCoupon Coupon { get; set; }
public Currency Currency { get; set; }
public decimal FaceValue { get; set; }
public IEnumerable<ValidationRule> SetCoupon(decimal amount, decimal rate)
{
var newCoupon = new BondCoupon
{
Rate = rate,
Amount = amount
};
if (Validate(new SetBondCouponValidator(newCoupon),out IEnumerable<ValidationRule> brokenRules))
{
Coupon = new BondCoupon
{
Rate = rate,
Amount = amount
};
}
return brokenRules;
}
}
public abstract class BaseAsset<T> : BaseEntity<T> where T : BaseEntity<T>, new()
{
public string Name { get; set; }
public string Isin { get; set; }
}
public class Asset : BaseAsset<Asset>, IEntityRoot
{
}
public class BaseEntity<T> where T : BaseEntity<T>, new()
{
public int Id { get; set; }
public bool IsDeleted { get; set; }
public bool Validate(IValidator validator, out IEnumerable<ValidationRule> brokenRules)
{
brokenRules = validator.GetBrokenRules();
return validator.IsValid();
}
}
問題を再現できるように、 'Asset'クラスと' Bond'クラスを追加できますか? –
私はちょうどドメインモデルを追加しました。これを見てくれてありがとう。 –
提供されているモデルでは再生できません。 'Asset'や' Bond'を継承する同じプロジェクト(アセンブリ)に他のクラスがありますか? –