我正在使用代码优先和实体框架核心创建数据库,我有 1:1 关系,但在这种关系中,我在两个实体中都有导航属性,这是我的第一个实体:
public class User
{
[Key]
public string Email { get; set; }
public virtual Mac Mac { get; set; }
public virtual Gender Gender { get; set; }
}
这是我的第二个实体:
public class Mac
{
[Key]
public Guid Id { get; set; }
public DateTime CreationDate { get; set; }
public HashSet<MacsUsers> MacsUsers { get; set; }
public string UserEmail { get; set; }
public User User { get; set; }
}
这是我的 dbContext 配置:
builder.Entity<User>().HasOne(u => u.Mac)
.WithOne()
.HasForeignKey<Mac>(g => g.UserEmail);
我在两个实体中都有这些导航属性的原因是我有一个查询,在其中我使用用户实体从 Mac 检索数据,如下所示:
foreach (var item in ListTupla)
{
item.CreationDate = listUser.FirstOrDefault(u => u.Mac.Id == item.MacId).Mac.User.CreationDate;
item.MacUserTalked = listUser.FirstOrDefault(u => u.Mac.Id == item.MacId).Mac.User.Email;//here Mac.User
item.MacUserWhoTalks = listUser.FirstOrDefault(u => u.Mac.Id == item.MacId).Email;
item.Name = listUser.FirstOrDefault(u => u.Mac.Id == item.MacId).Mac.User.Name; //here Mac.User
这正是消息警告:外键属性“Mac.UserEmail1”是在影子状态下创建的,因为实体类型中存在简单名称“UserEmail”的冲突属性,但要么未映射,要么已用于另一个属性关系,或者与关联的主键类型不兼容。有关 EF Core 中映射关系的信息,请参阅 https://aka.ms/efcore-relationships
我找到了一个解决方案,将 virtual 放在导航属性中,但它对我不起作用,有什么评论吗?
virtual
,它解决了问题。
modelBuilder.Entity<Project>()
.HasMany( e => e.FileDataLinks )
.WithOne( e => e.Project )
.HasForeignKey( e => e.ProjectId )
.HasPrincipalKey( e => e.Id )
.OnDelete( DeleteBehavior.NoAction );
modelBuilder.Entity<FileDataLink>()
.HasOne( s => s.Project )
.WithMany( g => g.FileDataLinks )
.HasForeignKey( s => s.ProjectId )
.OnDelete( DeleteBehavior.NoAction );