C# Can';t映射一到零或一个关系

C# Can';t映射一到零或一个关系,c#,entity-framework,ef-code-first,entity-framework-6,C#,Entity Framework,Ef Code First,Entity Framework 6,我首先使用代码生成表。 我有一个用户对象: public class ApplicationUser { public int? ImageId { get; set; } public virtual Image Image { get; set; } public virtual ICollection<Image> Images { get; set; } 我通过fluent api映射对象: protected override void OnModelCreating(D

我首先使用代码生成表。
我有一个用户对象:

public class ApplicationUser
{
public int? ImageId { get; set; }
public virtual Image Image { get; set; }
public virtual ICollection<Image> Images { get; set; }
我通过fluent 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);

不幸的是,EF不支持以这种方式进行1:1映射。如果你仔细想想,原因应该是显而易见的。您将如何在数据库中对此进行建模?你不能。您最多只能创建双1:many和多:1连接

也就是说,如果您有两个ApplicationUser行,它们可能都具有相同的ImageId。无法保证只有一行(至少不能没有约束,EF不支持约束)


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

嗯。。。你能建议我怎样修理我的模型吗?用户可以添加不同的图像,因此我必须已创建了按字段(userId)和用户可以,但不必具有ImageId(配置文件图像)。好吧,简单的方法就是将其设置为1:many,并且只添加一个图像。。。更困难的方法是,您必须使ImageId与您的用户id具有相同的主键,正如我上面解释的,这必须是用户表中的外键。使用相同的
PK
的选项是不可能的,因为图像表中的
ImageId
是自动递增的ghhh。。。好啊所以我应该再制作一个连接表,比如:
ProfileImages{UserId,ImageId}
当用户需要更新他的配置文件图像时,我只需要更新这个(连接)表,对吗?@1110-不,这将创建多对多关系。答1:很多是你想要的,你只需要在其中放一张图片。你是从个人资料还是从图片中选择1:多取决于你自己。如果是我,我知道你永远不会想要一个以上的图像,那么我会在图像上加上多面,这样1面就在配置文件上,以便通过导航属性更容易地访问它。@1110-顺便问一下,为什么ImageId必须是自动递增的?您当然可以使其不自动递增。
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);
modelBuilder.Entity<ApplicationUser>()
                .HasOptional(e => e.Image)
                .WithOptionalDependent()
                .WillCascadeOnDelete(false);