I have an entity which I've made a minor change to. I've made the foreign key non nullable and required. When I've come to create the Entity Framework migration I'm receiving an error:
The type 'Payment' has already been configured as an entity type. It cannot be reconfigured as a complex type.
I can't see why this is the case. I've not defined any class as a complex type. I'm using an Enum, but that has always been there and never been a problem before and supported under EF6.
The project itself still compiles fine.
Here is the Payment class which is causing the problem.
public partial class Payment
{
public int payment_ID { get; set; }
public int order_ID { get; set; }
public PaymentTypeEnum paymentType_ID { get; set; }
public string cc_response_ReceiptNo { get; set; }
public string cc_response_QSIResponseCode { get; set; }
public string cc_response_QSIResponseDescription { get; set; }
public string cc_response_TransactionNo { get; set; }
public string cc_response_BatchNo { get; set; }
public DateTime? cc_response_expected { get; set; }
public bool? cc_response_checked { get; set; }
public DateTime? paymentReceived { get; set; }
public int? paymentAmountUnits { get; set; }
public string paymentNotes { get; set; }
public string cc_GatewayIdent { get; set; }
public virtual Order Order { get; set; }
public virtual PaymentType PaymentType { get; set; }
public virtual ICollection<CreditNote> CreditNotes { get; set; }
}
Mapping information
public class tbl_paymentMap : EntityTypeConfiguration<Payment>
{
public tbl_paymentMap()
{
// Primary Key
this.HasKey(t => t.payment_ID);
// Properties
this.Property(t => t.cc_response_ReceiptNo)
.HasMaxLength(12);
this.Property(t => t.cc_response_QSIResponseCode)
.HasMaxLength(2);
this.Property(t => t.cc_response_QSIResponseDescription)
.HasMaxLength(150);
this.Property(t => t.cc_response_TransactionNo)
.HasMaxLength(21);
this.Property(t => t.cc_response_BatchNo)
.HasMaxLength(21);
this.Property(t => t.paymentNotes)
.HasMaxLength(100);
this.Property(t => t.cc_GatewayIdent)
.HasMaxLength(50);
// Table & Column Mappings
this.ToTable("tbl_payment");
this.Property(t => t.payment_ID).HasColumnName("payment_ID");
this.Property(t => t.order_ID).HasColumnName("order_ID");
this.Property(t => t.paymentType_ID).HasColumnName("paymentType_ID");
this.Property(t => t.cc_response_ReceiptNo).HasColumnName("cc_response_ReceiptNo");
this.Property(t => t.cc_response_QSIResponseCode).HasColumnName("cc_response_QSIResponseCode");
this.Property(t => t.cc_response_QSIResponseDescription).HasColumnName("cc_response_QSIResponseDescription");
this.Property(t => t.cc_response_TransactionNo).HasColumnName("cc_response_TransactionNo");
this.Property(t => t.cc_response_BatchNo).HasColumnName("cc_response_BatchNo");
this.Property(t => t.cc_response_expected).HasColumnName("cc_response_expected");
this.Property(t => t.cc_response_checked).HasColumnName("cc_response_checked");
this.Property(t => t.paymentReceived).HasColumnName("paymentReceived");
this.Property(t => t.paymentAmountUnits).HasColumnName("paymentAmountUnits");
this.Property(t => t.paymentNotes).HasColumnName("paymentNotes");
this.Property(t => t.cc_GatewayIdent).HasColumnName("cc_GatewayIdent");
// Relationships
this.HasRequired(t => t.Order)
.WithMany(t => t.Payments)
.HasForeignKey(d => d.order_ID);
this.HasRequired(t => t.PaymentType)
.WithMany(t => t.Payments)
.HasForeignKey(d => d.paymentType_ID);
}
}
OK this turned out to be a strange one of my own doing. Along side my payments class there is a CreditNote class. You can see in my original question that one Payment may have many Credit Notes.
On top of this both the Payment and the Credit notes individually referenced an order.
Whilst performing some normalisation I removed the link to the order class from the credit note class. Whilst fixing the bugs that ensued I went a bit beserk with find and replace and inadvertently performed it within the credit note mapping.
thus
public tbl_creditnoteMap()
{
this.Property(t => t.order_ID).HasColumnName("order_ID");
became
public tbl_creditnoteMap()
{
this.Property(t => t.Payment.order_ID).HasColumnName("order_ID");
When in reality it should have been deleted altogether. This obviously broke things break behind the scenes.
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