C# ef核心忽略导航属性
我有一个实体C# ef核心忽略导航属性,c#,entity-framework-core,ef-fluent-api,ef-core-2.0,navigation-properties,C#,Entity Framework Core,Ef Fluent Api,Ef Core 2.0,Navigation Properties,我有一个实体User,它有两个属性CreatedBy和UpdatedBy都引用User。默认情况下,EF假设这两个变量是一对一的关系。我收到以下错误消息: 消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要标识关系的子/依赖方,请配置外键属性。如果这些导航不应属于同一关系的一部分,请在不指定反向的情况下对其进行配置。有关更多详细信息,请参阅 目前,我有一门课是这
User
,它有两个属性CreatedBy
和UpdatedBy
都引用User
。默认情况下,EF假设这两个变量是一对一的关系。我收到以下错误消息:
消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要标识关系的子/依赖方,请配置外键属性。如果这些导航不应属于同一关系的一部分,请在不指定反向的情况下对其进行配置。有关更多详细信息,请参阅
目前,我有一门课是这样的:
public class User
{
public int Id { get; set; }
public int? CreatedById { get; set; }
public User CreatedBy { get; set; }
public int? UpdatedById { get; set; }
public User UpdatedBy { get; set; }
}
基本上,以下是我正在尝试的:
- 创建和更新的属性彼此之间没有关系(不需要导航/反向属性)
- 任何数量的用户都可以拥有相同的
,任何数量的用户都可以拥有相同的CreatedBy
李>UpdatedBy
CreatedBy
的主要原因是我以后可以使用Include(u=>u.CreatedBy)
。我知道使用IEnumerable AllCreatedUsers
属性可以解决这个问题,但我不想为实体中的每个属性创建IEnumerable
。有什么方法可以用fluentapi做到这一点吗
以下是我尝试过的:
modelBuilder.Entity<User>()
.Property<IEnumerable<User>>("AllCreatedUsers");
modelBuilder.Entity<User>().HasOne(u => u.CreatedBy)
.WithMany(u => EF.Property<IEnumerable<User>>(u, "AllCreatedUsers"));
modelBuilder.Entity()
.财产(“AllCreatedUsers”);
modelBuilder.Entity().HasOne(u=>u.CreatedBy)
.with many(u=>EF.Property(u,“AllCreatedUsers”);
您需要使用无参数和多个方法重载来配置两个关系:
modelBuilder.Entity<User>()
.HasOne(u => u.CreatedBy)
.WithMany();
modelBuilder.Entity<User>()
.HasOne(u => u.UpdatedBy)
.WithMany();
modelBuilder.Entity()
.HasOne(u=>u.CreatedBy)
.有许多();
modelBuilder.Entity()
.HasOne(u=>u.UpdatedBy)
.有许多();
您可以为这两个属性添加ForeignKey
数据注释
public class User
{
public int Id { get; set; }
public int? CreatedById { get; set; }
[ForeignKey("CreatedById")]
public User CreatedBy { get; set; }
public int? UpdatedById { get; set; }
[ForeignKey("UpdatedById")]
public User UpdatedBy { get; set; }
}
尝试在UpdatedBy
和CreatedBy
上使用ForeignKey
数据注释,为什么您希望EF在添加导航属性时忽略它,这样您就有了EF的导航属性?@viveknuna yes。。我在注解和流畅中尝试了ForeignKey
API@Progman考虑到我永远不会使用这样的IEnumerable
,在一个类中有这么多未使用的属性是没有意义的。@viveknuna-yep。再次尝试ForeignKey
成功。上次我可能只对一个属性使用了fk。这两种方法都有效。我之前已经试过了。我甚至试过用拷贝粘贴你的代码。这仍然是相同的结果,我可以说,这是处理此类模型的方法。如果你创建了一个干净的新项目,从问题中复制/粘贴User
类,从答案中复制/粘贴fluent配置,你会看到它是有效的。是的,刚刚测试过,它在干净的项目中工作得很好。然而,可能有一些特殊的情况,这是不考虑的。vivek的代码似乎在这两种情况下都有效。这对我来说没有任何意义。FK实际上与问题无关(如果它们不符合约定,我可以将它们包含在fluent设置中),并且在EF Core中数据注释是绝对不必要的(我会说是过时的)。