I have the following table created using Entity Framework Code First approach.
PaymentID
instead of Payment_ PaymentID
? Are there any attributes to achieve this?Note: Runtime version for EntityFramework.dll is v4.0.30XXX.
CODE
public abstract class PaymentComponent { public int PaymentComponentID { get; set; } public int MyValue { get; set; } public string MyType { get; set; } public abstract int GetEffectiveValue(); } public partial class GiftCouponPayment : PaymentComponent { public override int GetEffectiveValue() { if (MyValue < 2000) { return 0; } return MyValue; } } public partial class ClubCardPayment : PaymentComponent { public override int GetEffectiveValue() { return MyValue; } } public partial class Payment { public int PaymentID { get; set; } public List<PaymentComponent> PaymentComponents { get; set; } public DateTime PayedTime { get; set; } } //System.Data.Entity.DbContext is from EntityFramework.dll public class NerdDinners : System.Data.Entity.DbContext { public NerdDinners(string connString) : base(connString) { } protected override void OnModelCreating(DbModelBuilder modelbuilder) { modelbuilder.Conventions.Remove<PluralizingTableNameConvention>(); } public DbSet<GiftCouponPayment> GiftCouponPayments { get; set; } public DbSet<ClubCardPayment> ClubCardPayments { get; set; } public DbSet<Payment> Payments { get; set; } }
CLIENT
static void Main(string[] args) { string connectionstring = "Data Source=.;Initial Catalog=NerdDinners;Integrated Security=True;Connect Timeout=30"; using (var db = new NerdDinners(connectionstring)) { GiftCouponPayment giftCouponPayment = new GiftCouponPayment(); giftCouponPayment.MyValue = 250; giftCouponPayment.MyType = "GiftCouponPayment"; ClubCardPayment clubCardPayment = new ClubCardPayment(); clubCardPayment.MyValue = 5000; clubCardPayment.MyType = "ClubCardPayment"; List<PaymentComponent> comps = new List<PaymentComponent>(); comps.Add(giftCouponPayment); comps.Add(clubCardPayment); var payment = new Payment { PaymentComponents = comps, PayedTime=DateTime.Now }; db.Payments.Add(payment); int recordsAffected = db.SaveChanges(); } }
TPH inheritance needs special column which is used to identify the type of entity. By default this column is called Discriminator
and contains names of derived entities. You can use Fluent-API to define different column name and different values. You can also use your MyType column directly because it is actually a discriminator but in such case you cannot have that column in your entity (column can be mapped only once and if you use it as discriminator it is already considered as mapping).
The name of foreign key column can be again controlled with Fluent-API:
protected override void OnModelCreating(DbModelBuilder modelbuilder) { modelbuilder.Conventions.Remove<PluralizingTableNameConvention>(); // Example of controlling TPH iheritance: modelBuilder.Entity<PaymentComponent>() .Map<GiftPaymentComponent>(m => m.Requires("MyType").HasValue("G")) .Map<ClubPaymentComponent>(m => m.Requires("MyType").HasValue("C")); // Example of controlling Foreign key: modelBuilder.Entity<Payment>() .HasMany(p => p.PaymentComponents) .WithRequired() .Map(m => m.MapKey("PaymentId")); }
Add attribute [NotMapped] if the property not going to mapped to column.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With