【问题标题】:C# EF6 index attribute not workingC# EF6 索引属性不起作用
【发布时间】:2015-08-21 14:39:21
【问题描述】:

我正在尝试使用 EF6 将两个字段组合成一个唯一索引。但是 update-database 命令不会将“所有者”字段添加到索引中。我在想这是因为它不是原始类型而是 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; }
}

生成的索引:

创建唯一的非聚集索引 [IX_FundIdentifierAndOwner] ON [dbo].[Funds]([Identifier] ASC);

创建唯一的非聚集索引 [IX_FundNameAndOwner] ON [dbo].[Funds]([Name] ASC);

创建非集群索引 [IX_Owner_Id] ON [dbo].[Funds]([Owner_Id] ASC);

非常感谢任何帮助!

【问题讨论】:

  • ApplicationUser 定义如何?您可以使用 RelatedTo 属性 [RelatedTo(RelatedProperty=“Fund”, Key=”OwnerIDOnFund”, RelatedKey=”OwnerIDOnApplicationUser”)]

标签: c# entity-framework ef-code-first


【解决方案1】:

当您创建导航属性(对另一个表的引用)时,您应该指定要用作外键的列名。如果你不这样做,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的解释。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2013-03-01
    • 2010-12-08
    相关资源
    最近更新 更多