我首先使用代码生成表格 我有User对象:
public class ApplicationUser
{
public int? ImageId { get; set; }
public virtual Image Image { get; set; }
public virtual ICollection<Image> Images { get; set; }
和类图片:
public class Image
{
public int ImageId { get; set; }
public int CreatedBy { get; set; }
public virtual ApplicationUser CreatedByUser { get; set; }
我通过流畅的api映射对象:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// User can create many images
modelBuilder.Entity<Image>()
.HasRequired(e => e.CreatedByUser)
.WithMany(e => e.Images)
.HasForeignKey(e => e.CreatedBy)
.WillCascadeOnDelete(false);
// User can and doesn't have to have image
modelBuilder.Entity<ApplicationUser>()
.HasRequired(e => e.Image)
.WithOptional()
.WillCascadeOnDelete(false);
第一部分给我一个关系UserId > CreatedBy
罚款
但第二个关系是1:1
,相关字段是UserId > ImageId
,这不是我想要做的
我尝试使用HasOptional
代替HasRequired
,但后来我在表格中获得了额外的密钥
我该怎么做来映射这两张桌子?
更新1
根据答案。我将User
和Image
类保持不变
用户有一个图像(用于配置文件)和图像列表(用户创建的所有其他图像)
我使用流畅的api连接表格:
但EF为我生成了额外的密钥,并且没有使用User > ImageId
作为关键,我无法理解为什么?
modelBuilder.Entity<ApplicationUser>()
.HasOptional(e => e.Image)
.WithOptionalDependent()
.WillCascadeOnDelete(false);
答案 0 :(得分:1)
不幸的是,EF不支持以这种方式进行1:1映射。如果你考虑一下,原因应该是显而易见的。你会如何在数据库中建模?你不能。您可以做的最好的事情是创建双重1:多个和多个:1个连接。
即,如果您有两个ApplicationUser行,则它们都可以具有相同的ImageId。没有办法保证只有一行(至少没有约束,EF不支持)。
使用共享主键时,EF仅支持1:1。这意味着两个实体必须使用相同的密钥名称,并且它们都必须是主密钥,并且还必须使另一个成为外键。