Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework 6 - The type has already been configured as an entity type. It cannot be reconfigured as a complex type

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);
   }
}
like image 659
Chris Nevill Avatar asked Nov 09 '22 07:11

Chris Nevill


1 Answers

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.

like image 60
Chris Nevill Avatar answered Nov 14 '22 21:11

Chris Nevill