问题描述
|
我有以下观点
vw_Resources
-> ResourceId
-> Name
-> ReportsTo (maps to ResourceId)
和班级
public class Resource
{
public int ResourceId{get;set;}
public string Name{get;set;}
public Resource ReportsTo{get;set;}
}
和DbContext
public class MyContext
{
public DbSet<Resource> Resources { get; set; }
}
如何映射ReportsTo,以便DbContext返回Resource对象。我必须使用ModelBinder在DbContext类的以下方法中执行此操作
protected override void OnModelCreating(DbModelBuilder modelBuilder)
解决方法
以下映射有效
modelBuilder.Entity<Resource>().HasRequired(r => r.ReportsTo).WithMany().Map(r => r.MapKey(\"ReportsTo\"));
, 像这样修改您的实体
public class Resource
{
public int ResourceId{get;set;}
public string Name{get;set;}
public int? ReportsToId{get;set;}
public Resource ReportsTo{get;set;}
public ICollection<Resource> Reporters{get;set;}
}
然后映射为
modelBuilder.Entity<Resource>().HasOptional(r => r.ReportsTo)
.WithMany(r => r.Reporters)
.HasForeignKey(r => r.ReportsToId);
, 因为ResourceId
是您的PK,所以您不能具有自我引用的一对一关系。如果您也将其设为FK,则您会说从属Resource
与具有相同ResourceId
的主体资源相关,但这不是因为ResourceId
必须是唯一的。由于EF不支持唯一的非主键,因此在EF中根本不可能进行自引用一对一关系。