【EF Core】HasOne()、HasMany() 、WithOne()、WithMany()、HasForeignKey()

本文详细介绍了EFCore中的实体关系映射,包括HasOne、WithMany、HasForeignKey等方法的使用,阐述了一对一、一对多和多对多关系的配置,并强调了导航属性和外键的重要性。通过示例代码展示了如何建立和配置数据库表之间的关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

EF Core映射

        public override void Map(EntityTypeBuilder<BaseProcessingMethod> builderTable)
        {	//多个BaseProcessingMethod对应一个ProcessingType
            builderTable.HasOne(t => t.ProcessingType).WithMany().HasForeignKey(t => t.ProcessingTypeId);
            builderTable.HasOne(t => t.ProcessingType).WithMany().HasForeignKey(t => t.ProcessingTypeName_FromParent);
            //一个BaseProcessingMethod对应多个ReworkReason
            builderTable.HasMany(t => t.ReworkReason).WithOne().HasForeignKey(t => t.ProcessingMethodId);          
        }

HasForeignKey

配置属性 () 用作此关系的外键。

public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceCollectionBuilder HasForeignKey (params string[] foreignKeyPropertyNames);

foreignKeyPropertyNames String[] 
外键属性的名称。

如果实体类型上不存在指定的属性名称 () ,则将添加 (s) 的新阴影状态属性作为外键。 阴影状态属性是实体类中没有相应属性的属性。 属性的当前值存储在 中, ChangeTracker 而不是存储在实体类的实例中。

如果未 HasPrincipalKey(String[]) 指定 ,则将尝试将外键属性的数据类型和顺序与主体实体类型的主键匹配。 如果它们不匹配,形成唯一索引的新阴影状态属性将添加到主体实体类型中,用作引用键。

HasOne

配置一个关系,其中此实体类型具有指向关系中另一类型的单个实例的引用。

调用此方法后,应链接对 或 WithOne(String) 的WithMany(String)调用以完全配置关系。 如果只调用此方法而不调用链接,则不会产生有效的关系。

public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceNavigationBuilder HasOne (Type relatedType, string? navigationName = default);

relatedType Type
此关系面向的实体类型。

navigationName String
此实体类型上表示关系的引用导航属性的名称。 如果未指定任何属性,则将在此端不配置导航属性的关系。
public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceNavigationBuilder HasOne (string?navigationName);

navigationName String
此实体类型上表示关系的引用导航属性的名称。 导航必须是实体类型上的 CLR 属性。
public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceNavigationBuilder HasOne (string relatedTypeName, string? navigationName);

relatedTypeName String
此关系所面向的实体类型的名称。

navigationName String
此实体类型上表示关系的引用导航属性的名称。 如果未指定任何属性,则将在此端不配置导航属性的关系。

WithMany

将此配置为一对多关系。

public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceCollectionBuilder WithMany (string? collection = default);

collection String
此关系另一端的集合导航属性的名称。 如果为 null 或未指定,则关系的另一端没有导航属性。

请注意,在没有参数的情况下调用此方法会将关系的此端显式配置为不使用导航属性,即使实体类型上存在此类属性也是如此。 如果要使用导航属性,则必须指定它。

HasMany

配置一个关系,其中此实体类型具有包含关系中其他类型的实例的集合。

public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.CollectionNavigationBuilder HasMany (string navigationName);

navigationName String
此实体类型上表示关系的集合导航属性的名称。 如果未指定任何属性,则将在此端不配置导航属性的关系。
public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.CollectionNavigationBuilder HasMany (string relatedTypeName, string? navigationName);

relatedTypeName String
此关系所面向的实体类型的名称。

navigationName String
此实体类型上表示关系的集合导航属性的名称。 如果未指定任何属性,则将在此端不配置导航属性的关系。
public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.CollectionNavigationBuilder HasMany (Type relatedType, string? navigationName = default);

relatedType Type
此关系面向的实体类型。

navigationName String
此实体类型上表示关系的集合导航属性的名称。 如果未指定任何属性,则将在此端不配置导航属性的关系。

调用此方法后,应链接对 WithOne(String) 的调用以完全配置关系。 如果只调用此方法而不调用链接,则不会产生有效的关系。

WithOne

将此配置为一对一关系。

public virtual Microsoft.EntityFrameworkCore.Metadata.Builders.ReferenceReferenceBuilder WithOne (string? reference = default);

reference String
此关系另一端的引用导航属性的名称。 如果为 null 或未指定,则关系的另一端没有导航属性。

请注意,在没有参数的情况下调用此方法会将关系的此端显式配置为不使用导航属性,即使实体类型上存在此类属性也是如此。 如果要使用导航属性,则必须指定它。

没有粉丝,没有评论,甚至连读者都没有。因为自己写的烂,因为自己水平有限,所以自己的作品一经发出就石沉大海了,得不到任何的回信,就好像自己写的东西是给自己看的。自己的作品怎么看都好像不够完美,全身的毛病,所以读者不喜欢也很正常对吧!

其实最让我开心的是有些读者们夸我文笔不错,或许是有人第一次这样夸我的缘故吧!又或许是我写的东西没什么人认可,我感受到了一种前所未有的激动,对于未来的憧憬,对自己写下去的动力。

因为有你们,我的写作之路才不孤独,因为有你们,我才能坚持到现在,如果有一天我真的写出圈了,或许我们可以整个交流会之类的,到时候促膝长谈。

“书山有路勤为径,学海无涯苦作舟。”写作苦是苦了点,整得我差点就想放弃了,不过还好有你们。我也不急着成功,因为没有个几十年如一日的坚持,哪能轻易成功?

茫茫文海无人意,天下有君识吾心。文海很孤独,但是有诸君,便足以令我至千里。

详见

EntityFramework Core映射关系详解
ReferenceCollectionBuilder.HasForeignKey(String[]) 方法
ReferenceNavigationBuilder.WithMany(String) 方法
ReferenceNavigationBuilder.WithOne(String) 方法
EntityTypeBuilder.HasMany 方法
EntityTypeBuilder.HasOne 方法

在Entity Framework Core (EFCore) 中,处理自引用表是一个常见的场景,比如用户系统中,用户角色可以关联到其他用户,形成一个层级结构。以下是创建此类模型以及如何使用 EFCore 来操作的一个简单示例: 首先,我们定义两个实体类 User 和 Role,User 类有一个外键关联到自身的属性,表示用户的角色: ```csharp public class User { public int Id { get; set; } public string Name { get; set; } public List<Role> Roles { get; set; } // 自引用 } public class Role { public int Id { get; set; } public string Title { get; set; } public User Creator { get; set; } // 用户创建角色 public ICollection<User> Users { get; set; } // 角色拥有的用户集合 } ``` 然后,在数据库上下文中设置实体映射,并配置关系: ```csharp protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>() .HasMany(u => u.Roles) .WithOne(r => r.Creator) .HasForeignKey(r => r.CreatorId); // 用户通过CreatorId关联自身 modelBuilder.Entity<Role>() .HasMany(r => r.Users) .WithOne(u => u.Role) .HasForeignKey(u => uRoleId); // 角色通过RoleId关联其他用户 } ``` 在实际应用中,你可以像操作任何其他表一样插入、更新和删除数据: ```csharp // 插入新用户并分配角色 var newUser = new User { Name = "Alice", Roles = new List<Role>() }; newRole = new Role { Title = "Admin", Creator = newUser }; // 新角色的创建者是用户本身 context.Users.Add(newUser); context.Roles.Add(newRole); context.SaveChanges(); // 更新用户的角色 newRole.Users.Remove(newUser); // 移除角色 newRole.Users.Add(new User { Name = "Bob" }); // 添加新的用户 context.SaveChanges(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软泡芙

给爷鞠躬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值