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")将触发错误:名称已设置,它必须是唯一的。谢谢。

EF:使用流畅的API,无需生成新列的一对一关系

您已经说过,OrderOrderItem实体之间存在一对一的关系。如果是这种情况,那么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);
...