Asp.net mvc 4 代码优先-名称与类不同的导航属性

Asp.net mvc 4 代码优先-名称与类不同的导航属性,asp.net-mvc-4,ef-code-first,Asp.net Mvc 4,Ef Code First,在某些情况下,我的导航属性在类中重复,或者我不希望它与它所表示的类具有相同的名称。例如: public class Employee { public Guid EmployeeId { get; set; } public string Name { get; set; } } public class Project { public Guid ProjectId { get; set; } public DateTime Start { get; set;

在某些情况下,我的导航属性在类中重复,或者我不希望它与它所表示的类具有相同的名称。例如:

public class Employee 
{   
   public Guid EmployeeId { get; set; }
   public string Name { get; set; }
}

public class Project
{
   public Guid ProjectId { get; set; }
   public DateTime Start { get; set; }

   public Guid ResponsibleId { get; set; }
   public virtual Employee Responsible { get; set; }

   public Guid OwnerId { get; set; }
   public virtual Employee Owner { get; set; }
}
首先使用EF代码时,它会弄乱外键,创建具有不同名称的新外键。我该怎么处理

非常感谢

这将有助于:

public class Employee 
{   
  public Guid EmployeeId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Project> ResponsibleProjects { get; set; }
  public virtual ICollection<Project> OwnedProjects { get; set; }
}

public class Project
{
  public Guid ProjectId { get; set; }
  public DateTime Start { get; set; }

  public Guid ResponsibleId { get; set; }
  public virtual Employee Responsible { get; set; }

  public Guid OwnerId { get; set; }
  public virtual Employee Owner { get; set; }
}

public YourContext : DbContext 
{

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
     modelBuilder.Entity<Project>()
         .HasRequired(p => p.Owner)
         .WithMany(e => e.OwnedProjects )  
         .HasForeignKey(p => p.OwnerId );

     modelBuilder.Entity<Project>()
         .HasRequired(p => p.Responsible)
         .WithMany(e => e.ResponsibleProjects )  
         .HasForeignKey(p => p.ResponsibleId );

     base.OnModelCreating(modelBuilder);
  }
公共类员工
{   
公共Guid EmployeeId{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection负责项目{get;set;}
公共虚拟ICollection OwnedProjects{get;set;}
}
公共类项目
{
公共Guid项目ID{get;set;}
公共日期时间开始{get;set;}
公共Guid ResponsibleId{get;set;}
公共虚拟员工负责人{get;set;}
公共Guid所有者ID{get;set;}
公共虚拟员工所有者{get;set;}
}
公共YourContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(p=>p.Owner)
.有许多(e=>e.ownedProject)
.HasForeignKey(p=>p.OwnerId);
modelBuilder.Entity()
.HasRequired(p=>p.Responsible)
.有许多(e=>e.负责项目)
.HasForeignKey(p=>p.ResponsibleId);
基于模型创建(modelBuilder);
}
请注意如何为两端定义关系,以及如何指出用作外键的确切字段。

这将有助于:

public class Employee 
{   
  public Guid EmployeeId { get; set; }
  public string Name { get; set; }

  public virtual ICollection<Project> ResponsibleProjects { get; set; }
  public virtual ICollection<Project> OwnedProjects { get; set; }
}

public class Project
{
  public Guid ProjectId { get; set; }
  public DateTime Start { get; set; }

  public Guid ResponsibleId { get; set; }
  public virtual Employee Responsible { get; set; }

  public Guid OwnerId { get; set; }
  public virtual Employee Owner { get; set; }
}

public YourContext : DbContext 
{

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
     modelBuilder.Entity<Project>()
         .HasRequired(p => p.Owner)
         .WithMany(e => e.OwnedProjects )  
         .HasForeignKey(p => p.OwnerId );

     modelBuilder.Entity<Project>()
         .HasRequired(p => p.Responsible)
         .WithMany(e => e.ResponsibleProjects )  
         .HasForeignKey(p => p.ResponsibleId );

     base.OnModelCreating(modelBuilder);
  }
公共类员工
{   
公共Guid EmployeeId{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection负责项目{get;set;}
公共虚拟ICollection OwnedProjects{get;set;}
}
公共类项目
{
公共Guid项目ID{get;set;}
公共日期时间开始{get;set;}
公共Guid ResponsibleId{get;set;}
公共虚拟员工负责人{get;set;}
公共Guid所有者ID{get;set;}
公共虚拟员工所有者{get;set;}
}
公共YourContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(p=>p.Owner)
.有许多(e=>e.ownedProject)
.HasForeignKey(p=>p.OwnerId);
modelBuilder.Entity()
.HasRequired(p=>p.Responsible)
.有许多(e=>e.负责项目)
.HasForeignKey(p=>p.ResponsibleId);
基于模型创建(modelBuilder);
}

请注意如何为两端定义关系,以及我如何指出将哪个确切字段用作外键。

我最后这样做了,这是可行的:

public class Employee 
{   
   public Guid EmployeeId { get; set; }
   public string Name { get; set; }
}

public class Project
{
   public Guid ProjectId { get; set; }
   public DateTime Start { get; set; }

   public Guid ResponsibleId { get; set; }
   [ForeignKey("ResponsibleId")]
   public virtual Employee Responsible { get; set; }

   public Guid OwnerId { get; set; }
   [ForeignKey("OwnerId")]
   public virtual Employee Owner { get; set; }
}

多亏了Wiktor的评论,才有了这个解决方案。

我最终做到了这一点,效果很好:

public class Employee 
{   
   public Guid EmployeeId { get; set; }
   public string Name { get; set; }
}

public class Project
{
   public Guid ProjectId { get; set; }
   public DateTime Start { get; set; }

   public Guid ResponsibleId { get; set; }
   [ForeignKey("ResponsibleId")]
   public virtual Employee Responsible { get; set; }

   public Guid OwnerId { get; set; }
   [ForeignKey("OwnerId")]
   public virtual Employee Owner { get; set; }
}

感谢Wiktor对解决方案的评论。

您的元数据定义在哪里?或者您可能没有元数据定义,并且完全依赖自动约定?我正在执行约定重于配置。但是如果配置可以帮助解决此问题,我会洗耳恭听。当您说“创建具有不同名称的新元数据”时,它到底在做什么?您的元数据定义在哪里?或者您可能没有元数据定义,并且完全依赖自动约定?我在做约定而不是配置。但如果配置在这里有所帮助,我洗耳恭听。当您说它“创建具有不同名称的新元数据”时,它到底在做什么?