我正在使用Entity Framework Codefirst来创建我的数据库。当我通过ODBC连接到它时,具有模式名称dbo.pk_Jobs的默认主键似乎扰乱了访问2007。如果我手动编辑名称并删除模式名称并将此主键重命名为pk_jobs,则Access现在可以读取该表。
我是否可以使用Fluent Api,数据属性或任何其他方法指定主键名称不包含架构的名称。
public class ReportsContext : DbContext
{
public DbSet<Job> Jobs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Job>().ToTable("Jobs");
modelBuilder.Entity<Job>().HasKey(j => j.uuid);
base.OnModelCreating(modelBuilder);
}
}
public class Job
{
public Guid uuid{ get; set; }
public int active{ get; set; }
}
答案 0 :(得分:54)
如果要指定列名并覆盖属性名称,可以尝试以下操作:
使用注释
public class Job
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("CustomIdName")]
public Guid uuid { get; set; }
public int active { get; set; }
}
使用Code First
protected override void OnModelCreating(DbModelBuilder mb)
{
base.OnModelCreating(mb);
mb.Entity<Job>()
.HasKey(i => i.uuid);
mb.Entity<Job>()
.Property(i => i.uuid)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.HasColumnName("CustomIdName");
}
内部迁移配置
public partial class ChangePrimaryKey : DbMigration
{
public override void Up()
{
Sql(@"exec sp_rename 'SchemaName.TableName.IndexName', 'New_IndexName', 'INDEX'");
}
public override void Down()
{
Sql(@"exec sp_rename 'SchemaName.TableName.New_IndexName', 'Old_IndexName', 'INDEX'");
}
}
答案 1 :(得分:7)
您可以使用键属性指定主键的各个部分。所以你的Job类可能是
public class Job
{
[Key]
public Guid uuid{ get; set; }
public int active{ get; set; }
}
中定义
答案 2 :(得分:1)
如果我理解,您询问如何更改Entity Framework使用的主键列的名称。以下对HasKey语句的补充应该注意这一点:
modelBuilder.Entity<Job>().Property(j => j.uuid).HasColumnName("pk_Jobs")
答案 3 :(得分:1)
(这是@Jeff Sivers和@cubski的答案/评论的补充。)
据我所知,您无法使用数据属性指定PK名称。有时我需要删除名称的dbo.
部分,然后我使用手动编辑的代码首次迁移来更改名称,如下所示:
public partial class ChangeNameOnPKInCustomers : DbMigration
{
private static string fromName = "PK_dbo.Customers"; // Name to change
private static string toName = fromName.Replace("dbo.", "");
public override void Up()
{
Sql($"exec sp_rename @objname=N'[dbo].[{fromName}]', @newname=N'{toName}'");
// Now the PK name is "PK_Customers".
}
public override void Down()
{
Sql($"exec sp_rename @objname=N'[dbo].[{toName}]', @newname=N'{fromName}'");
// Back to "PK_dbo.Customers".
}
}
答案 4 :(得分:0)
使用Code First添加显式迁移时,会得到一个带有迁移名称的.cs文件,该文件是具有基类DbMigration的分部类。
对于主键约束,您可以使用DropPrimaryKey或AddPrimaryKey函数,具体取决于您要执行的操作。我的问题是使用DropPrimaryKey,因为我的Db具有不同的主键名称。
这两个函数都有重载来获取PK的名称,以便您可以显式指定PK的名称。对于具有显式PK名称的DropPrimaryKey,我工作得很好。对象anonymousArguments的参数默认为null。