Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework: How to avoid Discriminator column from table?

I have the following table created using Entity Framework Code First approach.

  1. How do I modify the C# code so that the unwanted Discriminator column is not created in the database? Are there any attributes to achieve this?
  2. How do I make the foreign key column named PaymentID instead of Payment_ PaymentID? Are there any attributes to achieve this?

Note: Runtime version for EntityFramework.dll is v4.0.30XXX.

enter image description here

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();     } } 
like image 416
LCJ Avatar asked Jul 24 '12 12:07

LCJ


2 Answers

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")); } 
like image 175
Ladislav Mrnka Avatar answered Sep 19 '22 23:09

Ladislav Mrnka


Add attribute [NotMapped] if the property not going to mapped to column.

like image 39
John Li Avatar answered Sep 19 '22 23:09

John Li