gpt4 book ai didi

entity-framework - 如何在 Entity Framework 中映射双重相关对象,即在相同实体之间定义两个 FK

转载 作者:行者123 更新时间:2023-12-04 08:36:25 24 4
gpt4 key购买 nike

我有表 User还有一张 table ProfileView .
它们是一对多的关系。
我在通过代码优先创建这些表之间的引用时遇到问题。
页面 View 看起来像这样:

public class ProfileView
{
public int ProfileViewId { get; set; }
public int ViewedWho { get; set; }
public virtual ApplicationUser ViewedWhoUser { get; set; }
public DateTime ViewDate{get;set;}
public int ViewedBy { get; set; }
public virtual ApplicationUser ViewedByUser { get; set; }
}

如您所见,User 中有两个引用至 ProfileView我怎样才能映射这个对象?
现在 EF 自动生成一些带有下划线的键,而不是我在 boject 中创建的键。

另外,当我创建相关对象时,我真的需要有类似 ICollection<ProfileView> ... 的东西吗?在相关User对象?
我试过这样映射它:

modelBuilder.Entity<ApplicationUser>()
.HasMany(m => m.WhoViewedMyProfile)
.WithMany(m => m.WhosProfileIViewed)
.Map(x => x.MapLeftKey("UserId")
.MapRightKey("ViewedWho")
.ToTable("ViewedBy"));

但我得到的只是:
enter image description here
ApplicationUser.cs 有:

public ICollection<ApplicationUser> WhoViewedMyProfile { get; set; }
public ICollection<ApplicationUser> WhosProfileIViewed { get; set; }

最佳答案

三种方式:

  1. 使用属性
  2. 使用 Fluent API
  3. 使用约定(不适用于这种情况)

注意:对两个属性重复

对于属性,您只需添加 ForeignKey attribute像这样:

[ForeignKey("ViewedWho")]
public virtual ApplicationUser ViewedWhoUser { get; set; }

使用 Fluent API,您需要像这样配置它:重写 OnModelCreating(DbModelBuilder builder) 方法,并像这样配置关系:

  modelBuilder.Entity<ProfileView>
.HasRequired(pv => pv.ViewedWhoUser) // or HasOptional
.WithMany()
.HasForeingKey(pv => pv.ViewedWho);

这在只有一个关系时有效,但对于多个关系,您需要使用前面的技术之一:请参阅 Code First Conventions 的关系约定部分的末尾

对于约定,您必须遵循 EF 理解的约定。我不是很确定,但尝试命名 ForeignKey 属性,例如在末尾附加 Id 的导航属性,即

public int ViewedWhoUserId { get; set; }

注意:实际上,EDM 是结合这三种技术构建的,因此您可以部分依赖约定(例如 PK)和属性或 Fluent API 以进行“微调”该模型。但是,就像在本例中一样,您可以使用不同的技术执行的操作存在一些差异。有趣的是,在 EF 6.1 上你可以 create your own custom conventions这可以让您免于编写一些属性和 Fluent API 配置。

关于entity-framework - 如何在 Entity Framework 中映射双重相关对象,即在相同实体之间定义两个 FK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24516728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com