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; }
}
并在DbContextOnModelCreating
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);