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