C# 实体框架一对多关系-命名为Id时如何重命名外键名称?

C# 实体框架一对多关系-命名为Id时如何重命名外键名称?,c#,asp.net-mvc,entity-framework,code-first,C#,Asp.net Mvc,Entity Framework,Code First,我正在尝试在asp.net标识表“aspnetusers”和我自己的“application”表之间创建一对多关系。问题是aspnetusers表主键没有名称前缀-它只是名为“Id”。我想为它创建一个名称,比如applicationSerid,这样在使用它进行绑定时就可以避免混淆。我该怎么做 public class Application { public int ApplicationId { get; set; } [Required] [DisplayName("Fir

我正在尝试在asp.net标识表“aspnetusers”和我自己的“application”表之间创建一对多关系。问题是aspnetusers表主键没有名称前缀-它只是名为“Id”。我想为它创建一个名称,比如applicationSerid,这样在使用它进行绑定时就可以避免混淆。我该怎么做

public class Application
{
public int ApplicationId { get; set; }

    [Required]
    [DisplayName("First Name")]
    public string FirstName { get; set; }

    [DisplayName("Last Name")]
    public string LastName { get; set; }

//**Need the aspnetuser table Id property here for my foreign key and would like to name it   ApplicationUserId - how do I do this? 

如果您只是将虚拟属性添加到
应用程序
类中,EF应负责在数据库中命名FK,您只需从代码访问该导航属性,即不需要知道代码中的FK列名。但是,如果您坚持指定它,您可以在您的类中尝试以下内容:

public class Application
{
    // other properties

    public int ApplicationUserId { get; set; }
    public virtual User User {get; set; }
}
在DbContext类中,使用fluent API并使用如下内容重写ModelCreating方法:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {
        modelBuilder.Entity<Application>()
                    .HasRequired(x => x.User)
                    .WithMany()
                    .HasForeignKey(k => k.ApplicationUserId);
    }
}
公共类MyDbContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(x=>x.User)
.有很多
.HasForeignKey(k=>k.applicationserid);
}
}

注意:我没有对此进行测试,因此可以根据您的具体需要对其进行自定义。

如果您只是将虚拟属性添加到
应用程序
类中,EF应该负责在数据库中命名FK,您只需从代码中访问该导航属性,即您不需要知道代码中的FK列名。但是,如果您坚持指定它,您可以在您的类中尝试以下内容:

public class Application
{
    // other properties

    public int ApplicationUserId { get; set; }
    public virtual User User {get; set; }
}
在DbContext类中,使用fluent API并使用如下内容重写ModelCreating方法:

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {
        modelBuilder.Entity<Application>()
                    .HasRequired(x => x.User)
                    .WithMany()
                    .HasForeignKey(k => k.ApplicationUserId);
    }
}
公共类MyDbContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(x=>x.User)
.有很多
.HasForeignKey(k=>k.applicationserid);
}
}

注意:我没有对此进行测试,因此请根据您的具体需要定制此功能。

您可以执行类似的操作吗

 public class Application
{
public int ApplicationId { get; set; }

[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }

[DisplayName("Last Name")]
public string LastName { get; set; }

[ForeignKey("aspnetusers")] 
[Column("Id")]
public int ApplicationUserId { get; set; }

public virtual aspnetusers aspnetusers {get; set; }
....

你能做些类似的事情吗

 public class Application
{
public int ApplicationId { get; set; }

[Required]
[DisplayName("First Name")]
public string FirstName { get; set; }

[DisplayName("Last Name")]
public string LastName { get; set; }

[ForeignKey("aspnetusers")] 
[Column("Id")]
public int ApplicationUserId { get; set; }

public virtual aspnetusers aspnetusers {get; set; }
....

出于某种原因,它说“aspnetusers”不是有效的导航属性。我在回答中添加了虚拟导航属性,出于某种原因,它说“aspnetusers”不是有效的导航属性。我在回答中添加了虚拟导航属性,你能提供一个仅添加虚拟属性的示例吗?这样行吗?公共虚拟应用程序用户ApplicationUser{get;set}是的,我相信这会起作用,如果
ApplicationUser
是正确的类型,两个表都在同一个数据库中,
ApplicationUser
在同一个DbContext中。但是,好的做法是将标识数据库和应用程序数据库分开,在这种情况下,您只需将ApplicationUser及其ID属性存储为一个“松散”属性,而该属性在数据库中不会“物理”相关。如果标识数据库和应用程序数据库分开,上述讨论就变得无关紧要了;)这确实创建了外键并将其命名为ApplicationUser_Id。出于绑定目的,我是使用此名称还是使用导航属性?例如,我有一个下拉列表:ViewBag.FullName=newselectlist(db.Users,“Id”,“FullName”,application.ApplicationUser);我总是喜欢在可能的情况下使用导航属性。您能提供一个仅添加虚拟属性的示例吗?这样行吗?公共虚拟应用程序用户ApplicationUser{get;set}是的,我相信这会起作用,如果
ApplicationUser
是正确的类型,两个表都在同一个数据库中,
ApplicationUser
在同一个DbContext中。但是,好的做法是将标识数据库和应用程序数据库分开,在这种情况下,您只需将ApplicationUser及其ID属性存储为一个“松散”属性,而该属性在数据库中不会“物理”相关。如果标识数据库和应用程序数据库分开,上述讨论就变得无关紧要了;)这确实创建了外键并将其命名为ApplicationUser_Id。出于绑定目的,我是使用此名称还是使用导航属性?例如,我有一个下拉列表:ViewBag.FullName=newselectlist(db.Users,“Id”,“FullName”,application.ApplicationUser);我总是喜欢在可能的情况下使用导航属性。不是我就是另外两个回答者没有领会你的意思。你不是在问如何将
aspnetusers.Id
(作为列)映射到
applicationserid
(作为属性)吗?我或其他两位回答者都没有领会你的意思。您不只是问如何将
aspnetusers.Id
(作为列)映射到
applicationserid
(作为属性)吗?