无法将一个映射到零或一个关系

时间:2014-07-03 20:26:59

标签: c# entity-framework ef-code-first entity-framework-6

我首先使用代码生成表格 我有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

根据答案。我将UserImage类保持不变 用户有一个图像(用于配置文件)和图像列表(用户创建的所有其他图像) 我使用流畅的api连接表格:
enter image description here
但EF为我生成了额外的密钥,并且没有使用User > ImageId作为关键,我无法理解为什么?

modelBuilder.Entity<ApplicationUser>()
                .HasOptional(e => e.Image)
                .WithOptionalDependent()
                .WillCascadeOnDelete(false);

1 个答案:

答案 0 :(得分:1)

不幸的是,EF不支持以这种方式进行1:1映射。如果你考虑一下,原因应该是显而易见的。你会如何在数据库中建模?你不能。您可以做的最好的事情是创建双重1:多个和多个:1个连接。

即,如果您有两个ApplicationUser行,则它们都可以具有相同的ImageId。没有办法保证只有一行(至少没有约束,EF不支持)。

使用共享主键时,EF仅支持1:1。这意味着两个实体必须使用相同的密钥名称,并且它们都必须是主密钥,并且还必须使另一个成为外键。