EF:使用流畅的API,无需生成新列的一对一关系
本文关键字:新列 关系 一对一 API EF | 更新日期: 2023-09-27 18:06:41
每次我尝试添加-migration时,它都会显示如下代码:
public override void Up()
{
AddColumn("dbo.Orders", "OrderItems_Id", c => c.Int(nullable: false));
CreateIndex("dbo.Orders", "OrderItems_Id");
AddForeignKey("dbo.Orders", "OrderItems_Id", "dbo.OrderItems", "Id");
}
我寻找谷歌,还没有找到解决方案,我的实体下面,我想设置orderItems的OrderId作为订单的外键引用。
public class OrderItems
{
public int Id { get; set; }
public int OrderId {get; set;}
public virtual Orders Order { get; set; }
}
public class Orders
{
public int Id { get; set; }
public virtual OrderItems Order { get; set; }
}
我的Fluent API如下所示:
public OrderItemsMapping()
{
this.HasKey(x => x.Id);
this.Property(x => x.GoodId).IsRequired();
this.Property(x => x.OrderId).IsRequired();
this.Property(x => x.Price).IsRequired();
this.Property(x => x.Quantity).IsRequired();
this.Property(x => x.Score).IsRequired();
this.HasOptional(x => x.Order)
.WithOptionalPrincipal(x => x.OrderItems)
.Map(configurationAction: new Action<ForeignKeyAssociationMappingConfiguration>(x => x.MapKey()));
}
我必须提到的另一件事是,x.MapKey("Id")将触发错误:名称已设置,它必须是唯一的。谢谢。
您已经说过,Order
和OrderItem
实体之间存在一对一的关系。如果是这种情况,那么OrderId
必须是OrderItem
实体中的主键。
另外,按照惯例,你的实体名称应该用单数而不是复数来命名。
因此,您的实体必须看起来像:public class OrderItem
{
public int OrderId { get; set;}
public virtual Order Order { get; set; }
}
public class Order
{
public int Id { get; set; }
public virtual OrderItem OrderItem { get; set; }
}
和OrderItem
映射:
// Primary Key
this.HasKey(m => m.OrderId);
...
this.HasRequired(m => m.Order)
.WithRequiredDependent(m => m.OrderItem);
...