Entity Framework 6 - 该类型已配置为实体类型。它不能重新配置为复杂类型
Entity Framework 6 - The type has already been configured as an entity type. It cannot be reconfigured as a complex type
我对一个实体做了一些小改动。我已经使外键不可为空并且是必需的。
当我开始创建 Entity Framework 迁移时,我收到一个错误:
The type 'Payment' has already been configured as an entity type. It
cannot be reconfigured as a complex type.
我不明白为什么会这样。我没有将任何 class 定义为复杂类型。
我使用的是枚举,但它一直存在并且以前从未出现过问题并且在 EF6 下受支持。
项目本身仍然可以正常编译。
这是导致问题的付款 class。
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; }
}
映射信息
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);
}
}
将以下内容添加到 OnModelCreating,我认为可以解决您的问题:
modelBuilder.Ignore<YourClassNameorEntityName>();
好的,结果证明这是我自己做的一件奇怪的事。
在我的付款 class 旁边有一张 CreditNote class。
您可以在我的原始问题中看到,一笔付款可能有很多信用票据。
除此之外,付款通知单和贷记通知单都分别引用了一个订单。
在执行一些标准化的同时,我从贷方通知单 class 中删除了订单 class 的 link。在修复随之而来的错误时,我对查找和替换有点着迷,无意中在信用票据映射中执行了它。
因此
public tbl_creditnoteMap()
{
this.Property(t => t.order_ID).HasColumnName("order_ID");
成为
public tbl_creditnoteMap()
{
this.Property(t => t.Payment.order_ID).HasColumnName("order_ID");
实际上它应该完全删除。
这显然打破了幕后的事情。
我对一个实体做了一些小改动。我已经使外键不可为空并且是必需的。 当我开始创建 Entity Framework 迁移时,我收到一个错误:
The type 'Payment' has already been configured as an entity type. It cannot be reconfigured as a complex type.
我不明白为什么会这样。我没有将任何 class 定义为复杂类型。 我使用的是枚举,但它一直存在并且以前从未出现过问题并且在 EF6 下受支持。
项目本身仍然可以正常编译。
这是导致问题的付款 class。
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; }
}
映射信息
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);
}
}
将以下内容添加到 OnModelCreating,我认为可以解决您的问题:
modelBuilder.Ignore<YourClassNameorEntityName>();
好的,结果证明这是我自己做的一件奇怪的事。 在我的付款 class 旁边有一张 CreditNote class。 您可以在我的原始问题中看到,一笔付款可能有很多信用票据。
除此之外,付款通知单和贷记通知单都分别引用了一个订单。
在执行一些标准化的同时,我从贷方通知单 class 中删除了订单 class 的 link。在修复随之而来的错误时,我对查找和替换有点着迷,无意中在信用票据映射中执行了它。
因此
public tbl_creditnoteMap()
{
this.Property(t => t.order_ID).HasColumnName("order_ID");
成为
public tbl_creditnoteMap()
{
this.Property(t => t.Payment.order_ID).HasColumnName("order_ID");
实际上它应该完全删除。 这显然打破了幕后的事情。