C# EF6 索引属性不起作用
C# EF6 index attribute not working
我正在尝试使用 EF6 将两个字段组合成一个唯一索引。但是 update-database 命令不会将 'Owner' 字段添加到索引中。我在想这是因为它不是原始类型而是 FK,但我不确定如何修复它。
public class Fund
{
[Key]
public int FundId { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=1)]
public ApplicationUser Owner { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order=2)]
[MaxLength(25)]
public string Name { get; set; }
[Required]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=2)]
[MaxLength(25)]
public string Identifier { get; set; }
public double Balance { get; set; }
}
生成的索引:
CREATE UNIQUE NONCLUSTERED INDEX [IX_FundIdentifierAndOwner]
ON [dbo].[Funds]([Identifier] ASC);
CREATE UNIQUE NONCLUSTERED INDEX [IX_FundNameAndOwner]
ON [dbo].[Funds]([Name] ASC);
CREATE NONCLUSTERED INDEX [IX_Owner_Id]
ON [dbo].[Funds]([Owner_Id] ASC);
非常感谢任何帮助!
当您创建导航 属性(引用另一个 table)时,您应该指定要用作外键的列名。如果您不这样做,EF 会假定它是一个名为 Objectname_Id.
的列
您可以在 sql 代码中看到它调用了您的列 [Owner_Id]。问题是,当您这样做时,您无法控制该列的数据注释。
试试这个
public class Fund
{
[Key]
public int FundId { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 1)]
public int OwnerId { get; set; } // <---- ADD THIS!
public virtual ApplicationUser Owner { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 2)]
[MaxLength(25)]
public string Name { get; set; }
[Required]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 2)]
[MaxLength(25)]
public string Identifier { get; set; }
public double Balance { get; set; }
}
添加名为 ObjectId(或 Objec_Id)的列 EF 按照约定理解该列是 属性 所有者。
这是迁移生成的脚本:
CREATE TABLE [dbo].[Funds] (
[FundId] [int] NOT NULL IDENTITY,
[OwnerId] [int] NOT NULL,
[Name] [nvarchar](25) NOT NULL,
[Identifier] [nvarchar](25) NOT NULL,
[Balance] [float] NOT NULL,
CONSTRAINT [PK_dbo.Funds] PRIMARY KEY ([FundId])
)
CREATE UNIQUE INDEX [IX_FundIdentifierAndOwner] ON [dbo].[Funds]([OwnerId], [Identifier])
CREATE UNIQUE INDEX [IX_FundNameAndOwner] ON [dbo].[Funds]([OwnerId], [Name])
这里是对默认Code First Conventions的解释。
我正在尝试使用 EF6 将两个字段组合成一个唯一索引。但是 update-database 命令不会将 'Owner' 字段添加到索引中。我在想这是因为它不是原始类型而是 FK,但我不确定如何修复它。
public class Fund
{
[Key]
public int FundId { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=1)]
public ApplicationUser Owner { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order=2)]
[MaxLength(25)]
public string Name { get; set; }
[Required]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order=2)]
[MaxLength(25)]
public string Identifier { get; set; }
public double Balance { get; set; }
}
生成的索引:
CREATE UNIQUE NONCLUSTERED INDEX [IX_FundIdentifierAndOwner] ON [dbo].[Funds]([Identifier] ASC);
CREATE UNIQUE NONCLUSTERED INDEX [IX_FundNameAndOwner] ON [dbo].[Funds]([Name] ASC);
CREATE NONCLUSTERED INDEX [IX_Owner_Id] ON [dbo].[Funds]([Owner_Id] ASC);
非常感谢任何帮助!
当您创建导航 属性(引用另一个 table)时,您应该指定要用作外键的列名。如果您不这样做,EF 会假定它是一个名为 Objectname_Id.
的列您可以在 sql 代码中看到它调用了您的列 [Owner_Id]。问题是,当您这样做时,您无法控制该列的数据注释。
试试这个
public class Fund
{
[Key]
public int FundId { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 1)]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 1)]
public int OwnerId { get; set; } // <---- ADD THIS!
public virtual ApplicationUser Owner { get; set; }
[Required]
[Index("IX_FundNameAndOwner", IsUnique = true, Order = 2)]
[MaxLength(25)]
public string Name { get; set; }
[Required]
[Index("IX_FundIdentifierAndOwner", IsUnique = true, Order = 2)]
[MaxLength(25)]
public string Identifier { get; set; }
public double Balance { get; set; }
}
添加名为 ObjectId(或 Objec_Id)的列 EF 按照约定理解该列是 属性 所有者。
这是迁移生成的脚本:
CREATE TABLE [dbo].[Funds] (
[FundId] [int] NOT NULL IDENTITY,
[OwnerId] [int] NOT NULL,
[Name] [nvarchar](25) NOT NULL,
[Identifier] [nvarchar](25) NOT NULL,
[Balance] [float] NOT NULL,
CONSTRAINT [PK_dbo.Funds] PRIMARY KEY ([FundId])
)
CREATE UNIQUE INDEX [IX_FundIdentifierAndOwner] ON [dbo].[Funds]([OwnerId], [Identifier])
CREATE UNIQUE INDEX [IX_FundNameAndOwner] ON [dbo].[Funds]([OwnerId], [Name])
这里是对默认Code First Conventions的解释。