我有两个班级:
[Table("Sales.Order")]
public partial class Order
{
public int Id { get; set; } //conventions allow for Id property
public int? ParentId { get; set; } //self referencing
public virtual Order ParentOrder { get; set; }
public virtual ICollection<Order> ChildOrders { get; set; }
public byte? OrderRelationTypeId { get; set; }
}
[Table("Sales.OrderRelationType")]
public partial class OrderRelationType
{
public OrderRelationType()
{
Orders = new HashSet<Order>();
}
public byte Id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}
和一些流利的api:
modelBuilder.Entity<Order>()
.HasMany(e => e.ChildOrders)
.WithOptional(e => e.ParentOrder)
.HasForeignKey(e => e.ParentId);
生成迁移+ db更新后 sql有正确的表:
CREATE TABLE [Sales].[Order] (
[OrderId] [int] NOT NULL IDENTITY,
[ParentId] [int],
[OrderRelationTypeId] [tinyint],
CONSTRAINT [PK_Sales.Order] PRIMARY KEY ([OrderId])
)
CREATE TABLE [Sales].[OrderRelationType] (
[OrderRelationTypeId] [tinyint] NOT NULL IDENTITY,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Sales.OrderRelationType] PRIMARY KEY ([OrderRelationTypeId])
)
但也有一些错误的索引创建代码
ALTER TABLE [Sales].[Order]
ADD CONSTRAINT [FK_Sales.Order_Sales.Order_ParentId]
FOREIGN KEY ([ParentId]) REFERENCES [Sales].[Order] ([Id])
外键'FK_Sales.Order_Sales.Order_ParentId'引用引用表'Sales.Order'中的无效列'Id'。
和
ALTER TABLE [Sales].[Order]
ADD CONSTRAINT [FK_Sales.Order_Sales.OrderRelationType_OrderRelationTypeId]
FOREIGN KEY ([OrderRelationTypeId]) REFERENCES [Sales].[OrderRelationType] ([Id])
外键'FK_Sales.Order_Sales.OrderRelationType_OrderRelationTypeId'引用引用表'Sales.OrderRelationType'中的无效列'Id'。
所以EF正在创建正确的列名,但在索引中引用了错误的名称?
我确实想使用Id而不是OrderId作为属性名称,而且就我所见,我并没有做任何违法行为。 我使用的是ef 6.1.3
生成的迁移代码:
CreateTable(
"Sales.Order",
c => new
{
OrderId = c.Int(nullable: false, identity: true),
CouponId = c.Int(),
ParentId = c.Int(),
OrderRelationTypeId = c.Byte(),
})
.PrimaryKey(t => t.OrderId)
.ForeignKey("Sales.Order", t => t.ParentId)
.ForeignKey("Sales.OrderRelationType", t => t.OrderRelationTypeId)
.Index(t => t.ParentId)
.Index(t => t.OrderRelationTypeId);
CreateTable(
"Sales.OrderRelationType",
c => new
{
OrderRelationTypeId = c.Byte(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.OrderRelationTypeId);