【问题标题】:How to stop EF4.1 Code-First to create Culstered index for the entity PK如何停止 EF4.1 Code-First 为实体 PK 创建聚集索引
【发布时间】:2011-04-28 03:13:54
【问题描述】:

使用以下简单实体类,EF4.1 Code-First 将在初始化数据库时为 PK UserId 列创建聚集索引。

    public class User
    {
        [Key]
        public int UserId { get; set; }
        public int AppId  { get; set; }
        public string UserName { get; set; }
    }

出于性能考虑,我的设计目标是保持生成的Users 表根据AppId 的物理集群而不是PK。

在我的 Initializer 类中,我尝试手动删除自动生成的 PK 聚集索引并创建我需要的任何聚集索引,但这里没有任何线索可以预测索引的自动生成名称 PK__Users__25518C17

我是 Code-First 世界的新手,真的不知道是否有任何解决方法可以实现我的设计目标。

提前致谢

【问题讨论】:

    标签: sql-server entity-framework ef-code-first code-first entity-framework-4.1


    【解决方案1】:

    您不需要预测自动生成索引的名称。您只需要选择索引的名称。对于 SQL 服务器,您可以使用如下查询:

    SELECT I.Name
    FROM sys.indexes AS I
    INNER JOIN sys.tables AS T ON
        I.object_Id = T.object_Id
    WHERE I.is_primary_key = 1 
        AND T.Name = 'Users'
    

    在自定义初始化程序中获得名称后,您可以更改旧索引并创建新索引。

    【讨论】:

    • 非常感谢,这对我继续我的方法很有帮助。但后来我了解到我必须删除/重新创建每个索引/关系才能使用户表聚集在 AppId 上。
    • 现实应用中非常痛苦的方法!!如果没有像 [Key(NonClustered)] 或 [Index(Clustered)] 之类的注释,也没有自定义约定,我的方法是先设计数据库然后再设计代码!仍然开放的建议或提示。再次感谢。
    • Hossam,我实际上认为您得出了正确的结论。数据库生成实际上仅适用于简单应用程序上的不加选择的模式,这些模式可以 A) 生成到任何数据源 - 即使是可配置的 & B) 也很简单。因为不是所有的数据存储系统都知道聚集索引是什么,EF 可能甚至不会处理它……这意味着您绝对是时候管理自己的架构了。使用数据库项目意味着您可以导入生成的数据库并非常轻松地对其进行调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2021-01-14
    • 2012-11-26
    • 1970-01-01
    相关资源
    最近更新 更多