【发布时间】:2014-03-07 15:40:16
【问题描述】:
我有以下两个类:
public class Blog
{
public int Id { get; set; }
public BlogDetail BlogDetail { get; set; }
}
public class BlogDetail
{
public int Id { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
Blog 和BlogDetail 是一一对应的关系,外键是Blog.Id 到BlogDetail.BlogId。
BlogDetail.BlogId 是强制一对一关系的唯一约束。
BlogDetail.Id 列是必需的,因为另一个表会将 BlogDetail 引用为一对多。
我添加了以下映射:
public BlogMap()
{
HasKey(t => t.Id);
Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
public BlogDetailMap()
{
HasKey(t => t.Id);
Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(t => t.Blog).WithMany().HasForeignKey(e => e.BlogId);
}
我试图让 EF 6 使用无主键字段作为键来生成正确的 sql 查询,但无济于事。它给了我以下 sql 查询:
select *
from Blog
left join BlogDetail on Blog.BlogDetail_Id = BlogDetail.Id
实际上我需要的是:
select *
from Blog
left join BlogDetail on Blog.Id = BlogDetail.BlogId
有谁知道如何在 EF 中使用非主键字段实现一对一映射?我已尽一切可能无济于事。
如果有帮助,我将在 BlogDetail 上悬挂另一张桌子:
public class BlogDetailSupplier
{
public int Id { get; set; }
public int BlogDetailId { get; set; }
public BlogDetail BlogDetail { get; set; }
}
这就是为什么 BlodDetail 必须有一个 ID PK 列和一个 briefId FK 列。标准归一化。
【问题讨论】:
标签: c# entity-framework mapping