C# 实体框架代码优先:如何设置一对一关系而不使用;“委托人”;还有相同的身份证?

C# 实体框架代码优先:如何设置一对一关系而不使用;“委托人”;还有相同的身份证?,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有两节课。第一个是: public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } public string Name { get; set; } public DateTime Birth { get; set; } public Sex Sex { get; s

我有两节课。第一个是:

public class User
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string Name { get; set; }
    public DateTime Birth { get; set; }
    public Sex Sex { get; set; }
    public List<Album> Albums { get; set; }
    public DateTime Created { get; set; }

    public Picture ProfilePicture { get; set; }
}
public class Picture
{
    public int Id { get; set; }
    public Album Album { get; set; }
    public string Path { get; set; }
    public string Description { get; set; }
    public DateTime Created { get; set; }

    public User User { get; set; }
}
图片保存在一个表中,用户可以在相册中拥有任意多的图片,并且可以使用相册访问这些图片。以下是
专辑
课程:

public class Album
{
    public int Id { get; set; }
    public User User { get; set; }
    public AlbumType Type { get; set; }
    public List<Picture> Pictures { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
}
我的问题是EF认为我想要创建一对一的关系,在这种关系中我必须定义一个主体,并且两个实体必须具有相同的ID。
Picture
的实体必须具有自己的ID,
用户也必须具有自己的ID。我怎么能对EF这么说呢
user.ProfilePicture.Id
works

任何帮助都将不胜感激

有一个图片对象,我希望能够检索该图片的用户所有者,执行类似Picture.User的操作,该操作目前有效

我建议您删除或重命名
User
属性,因为它具有误导性-图片的所有者是
picture.Album.User
,而此属性实际上与
User.ProfilePicture
相反

另外,您确实需要(作为例外状态)使用fluent API解析
User.ProfilePicture
关系的主体/依赖部分

因此,以下是选项:

(A) 删除
图片。用户
属性

public class Picture
{
    public int Id { get; set; }
    public Album Album { get; set; }
    public string Path { get; set; }
    public string Description { get; set; }
    public DateTime Created { get; set; }
}
public class Picture
{
    public int Id { get; set; }
    public Album Album { get; set; }
    public string Path { get; set; }
    public string Description { get; set; }
    public DateTime Created { get; set; }
    public User ProfileOf { get; set; }
}
并在DbContext
OnModelCreating
override中使用以下命令:

modelBuilder.Entity<User>()
    .HasOptional(e => e.ProfilePicture)
    .WithOptionalPrincipal();
和使用

modelBuilder.Entity<User>()
    .HasOptional(e => e.ProfilePicture)
    .WithOptionalPrincipal(e => e.ProfileOf);
modelBuilder.Entity()
.has可选(e=>e.ProfilePicture)
.具有可选原则(e=>e.ProfileOf);

这两个选项都会将
int?
表中的
Picture
列引入
User
表。

我考虑了(A)建议,谢谢,但我想在User表中保留一列Picture的id,在图片的表格中创建一个外键,指向用户的表格,只说哪张图片是配置文件图片,这是我想要避免的。有什么建议吗?@Kuma仅当
图片
-
用户
为1:n时。它是1:n,因为数据模型中没有任何东西阻止多个用户引用同一张图片。您需要通过某种形式的验证来排除这种情况。您可以通过将配置中的单词
Principal
更改为
Dependent
,但请注意,它会创建依赖循环,即创建用户、创建相册、创建图片、,将图片设置为用户的个人资料图片-EF无法在单个事务中处理该问题。@GertArnold感谢@IvanStoev的建议,我改变了这一点。不再有
Picture.User
属性。我知道从数据库设计的角度来看,它看起来很奇怪,但如果您不想以后遇到创建/删除用户的问题,我建议您保持这种方式。我是否正确理解数据库模型无法修改?@GertArnold它可以修改。这样做的目的只是在用户的记录中写入其个人资料图片的id,并在代码中使用类似于
user.ProfilePicture
的代码行获取图片对象。换句话说,用户表中应该有一个id为
Picture
的外键,而不是图片表中id为
User
的外键,这样才能写入
User.ProfilePicture
。我不知道如何首先使用代码。也许这是不可能的。只使用EF,可能是的,但首先使用代码,可能不是。
modelBuilder.Entity<User>()
    .HasOptional(e => e.ProfilePicture)
    .WithOptionalPrincipal(e => e.ProfileOf);