实体框架主键约束

时间:2015-03-17 12:57:06

标签: sql-server entity-framework primary-key

我正在使用Entity Framework 6.0和Microsoft SQL Server。默认情况下,它为表生成的主键名为PK_dbo.TableName,其中TableName是复数形式,即使表的实际名称是单数形式。

例如,我有一个名为dbo.Employee的表。然而,EF 6表示的主键是PK_dbo.Employees

有没有办法将主键更改为PK_TableName,其中TableName是单数形式?

更新:感谢您的回复。我并不是要重命名为主键的列名。我喜欢的是重命名生成的数据库中的关键约束,这是我们团队中的数据库人员所要求的。对不起,我在第一篇文章中没有说清楚。我确实在这篇文章中看到了一些讨论:Entity Framework 4.1: Name constraints。但是,尚未发现任何简单的解决方案。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

public class PKNameGenerator : SqlServerMigrationSqlGenerator {
        static readonly string PREFIX = "PK";
        protected override void Generate(CreateTableOperation createTableOperation) {
            createTableOperation.PrimaryKey.Name = GetPkName(createTableOperation.Name);
            base.Generate(createTableOperation);
        }

        protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation) {
            addPrimaryKeyOperation.Name = GetPkName(addPrimaryKeyOperation.Table);
            base.Generate(addPrimaryKeyOperation);
        }

        protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation) {
            dropPrimaryKeyOperation.Name = GetPkName(dropPrimaryKeyOperation.Table);
            base.Generate(dropPrimaryKeyOperation);
        }

        // Prefix + Table name without schema
        string GetPkName(string tableName) {
            return PREFIX + tableName.Substring(tableName.IndexOf('.')+1);
        }
    }

然后你需要像那样注册:

public class DataContextConfiguration : DbConfiguration {
            public DataContextConfiguration() {      
                SetMigrationSqlGenerator(SqlProviderServices.ProviderInvariantName, () => new PKNameGenerator());
            }
        }

请务必放置上述课程in the same assembly as a class derived from DbContext或使用DbConfigurationTypeAttribute

[DbConfigurationType(typeof(CustomDbConfiguration))]
public class YourEntities : DbContext

来源:https://stackoverflow.com/a/31553476/3111429

更多信息:https://entityframework.codeplex.com/wikipage?title=Code%20First%20Annotations部分 SQL生成

使用EF Core你可以这样做:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasKey(b => b.BlogId)
            .HasName("PrimaryKey_BlogId");
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

来源:http://ef.readthedocs.io/en/latest/modeling/relational/primary-keys.html#fluent-api

答案 1 :(得分:0)

您可以明确设置数据库字段的名称,但我不确定这是否是您正在寻找的内容。

[Key]
[Column("PK_Employee")]
public int EmployeeId {get; set;}

答案 2 :(得分:0)

Fluent API很干净,因此使用单独的配置文件

更加清洁
public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
    public EmployeeConfiguration()
    {
        HasKey(x => x.EmployeeId);
    }
}

OnModelCreating可以添加此配置文件

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Configurations.Add(new EmployeeConfiguration());