Entity Core FluentAPI - 作为主键和外键的 ID

ykh

我有两个实体UserProfile. 这些实体中的每一个都继承自一个Entity包含Id属性用户和配置文件之间的关系是一对一的关系。我正在尝试使用为 User 实体创建的相同 Id 作为 Profile 实体的 Id,即User.Id == Profile.Id.

我一直在尝试使用 FluentAPI 来做到这一点,但我无法做到。我已经阅读了这个问题,也阅读了这篇文章,但我仍然无法找到解决我的问题的方法。

这是我的实体的代码:

public class Entity<TKey> : IEntity
{
    /// <summary>
    /// Unique identifier for this entity.
    /// </summary>
    public virtual int Id { get; set; }
}

public class User : Entity<int>
{
    public virtual Profile ProfileItem { get; set; }
}

public class Profile : Entity<int> 
{

}

到目前为止,这是我的试验,其中都失败了:

  • 此映射ProfileItemIdUser表中生成了一个

    modelBuilder.Entity<User>().HasOne(u => u.ProfileItem)
        .WithOne()
        .HasForeignKey<Profile>(p => p.Id)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);
    
  • 我尝试在Profile实体中为User. User表已正确映射,但UserId中添加了Profile

    modeBuilder.Entity<User>().HasOne(u => u.ProfileItem)
        .WithOne(u => u.User)
        .HasForeignKey<Profile>(p => p.Id)
        .IsRequired()
        .OnDelete(DeleteBehavior.Cascade);
    

如我之前提到的问题中所报告的,此问题的唯一解决方案是您必须添加一个反向属性,然后使用数据注释。我尝试了以下方法并且有效:

public class Entity<TKey> : IEntity
{
    /// <summary>
    /// Unique identifier for this entity.
    /// </summary>
    public virtual int Id { get; set; }
}

public class User : Entity<int>
{
    [InverseProperty("User")]
    public virtual Profile ProfileItem { get; set; }
}

public class Profile : Entity<int> 
{
    [ForeignKey("Id")]
    public virtual User User { get; set; }
}

如何使用 FluentAPI 获得相同的效果?

ykh

@Ivan 说的是对的。在我发布的示例中,我对 OnModelCreating 事件进行了映射,但在我的实际代码中,我使用了基类进行映射,这就是问题所在。

这是我当前产生问题的代码:

  • 实体映射的基类

    public class EntityTypeConfigurationBase<T> : IEntityTypeConfiguration<T> where T : class, IEntity
    {
        private bool BIgnoreBaseProps = true;
    
        public EntityTypeConfigurationBase(bool bIgnoreBaseProps = true) : base()
        {
            BIgnoreBaseProps = bIgnoreBaseProps;
        }
    
        public void Configure(EntityTypeBuilder<T> builder)
        {
            if (BIgnoreBaseProps)
            {
                builder.Ignore(x => x.State);
                builder.Ignore(x => x.AssociationState);
            }
        }
    }
    
  • 我的映射类

    public class UserMap : EntityTypeConfigurationBase<User>
    {
    
       new public void Configure(EntityTypeBuilder<User> builder)
       {
    
        builder.HasKey(u => u.Id);
        builder
            .HasOne(u => u.ProfileItem)
            .WithOne()
            .HasForeignKey<Profile>(p => p.Id)
            .IsRequired()
            .OnDelete(DeleteBehavior.Cascade);
        builder.ToTable("User");
    
        base.Configure(builder);
        }
    }
    

问题出在映射类中,在 Configure 方法中。在基类中,我需要忽略一些共享属性,而在映射类中,我需要进行自定义映射。所使用的方法被命名Configure为映射需要实现。由于基类和派生类都使用相同的方法名称,因此会导致重复调用。第一次调用是针对基本类型方法,第二次是针对映射类。映射进行了两次,外键(我的问题)是在第一次映射时生成的。

此问题的解决方案是将基类型方法标记为virtual,然后覆盖基类型上的方法。基类型方法调用将采用相同的ModelBuilder对象,并且不会再次复制映射。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将数据插入表中作为主键外键的一部分-Entity Framework

来自分类Dev

外键作为主键?

来自分类Dev

外键,急切加载和DTO(.NET Core 3.1 / Entity Framework Core)

来自分类Dev

错误:对Cosmos DB和Entity Framework Core 3.1.2进行“更新”调用时,“替代键属性'id'为空”

来自分类Dev

实体框架FluentAPI命名主键

来自分类Dev

使用自动递增ID作为主键

来自分类Dev

ASP.NET Core 3.1和Entity Framework Core会根据ID从数据库中删除多个记录

来自分类Dev

使用外键作为主键

来自分类Dev

复合外键作为主键

来自分类Dev

在Entity Framework Core中获取当前用户ID的正确方法

来自分类Dev

在Entity Framework Core中获取当前用户ID的正确方法

来自分类Dev

无法在 ASP.NET Core 代码优先 EF 模型中将 Id 设置为主键

来自分类Dev

为id EF Core 3.1创建重复的外键和列

来自分类Dev

在mongo中使用slug作为主键/ _id的性能劣势?

来自分类Dev

cakephp mysql,自动递增id或varchar作为主键

来自分类Dev

如何通过Sails js使用bigserial作为主键ID

来自分类Dev

使用UUID作为主键时,Hibernate的ID值错误

来自分类Dev

使用 Guid 作为主键和外键 Sqllite C#

来自分类Dev

尝试更新作为主键和其他表的外键的数据库属性

来自分类Dev

原始SQL查询和Entity Framework Core

来自分类Dev

创建在同一时间实体和相关实体id作为主键

来自分类Dev

ASP.NET Core MVC + Entity Framework Core如何获取新添加的对象的ID

来自分类Dev

作为主键给出的一组属性的外键

来自分类Dev

使用Entity Framework Core在部分主键上自动递增

来自分类Dev

如何使用Entity Framework Core删除没有外键的相关数据

来自分类Dev

.net core 2 Entity Framework - ApplicationUser 扩展外键对象未在获取时填充

来自分类Dev

CakePHP-主键问题,如何覆盖默认的“ id”字段作为主键

来自分类Dev

CakePHP-主键问题,如何覆盖默认的“ id”字段作为主键

来自分类Dev

属性为null,导致NullReferenceException,但Entity Framework数据库中的主键和外键正确且彼此完全匹配

Related 相关文章

  1. 1

    将数据插入表中作为主键外键的一部分-Entity Framework

  2. 2

    外键作为主键?

  3. 3

    外键,急切加载和DTO(.NET Core 3.1 / Entity Framework Core)

  4. 4

    错误:对Cosmos DB和Entity Framework Core 3.1.2进行“更新”调用时,“替代键属性'id'为空”

  5. 5

    实体框架FluentAPI命名主键

  6. 6

    使用自动递增ID作为主键

  7. 7

    ASP.NET Core 3.1和Entity Framework Core会根据ID从数据库中删除多个记录

  8. 8

    使用外键作为主键

  9. 9

    复合外键作为主键

  10. 10

    在Entity Framework Core中获取当前用户ID的正确方法

  11. 11

    在Entity Framework Core中获取当前用户ID的正确方法

  12. 12

    无法在 ASP.NET Core 代码优先 EF 模型中将 Id 设置为主键

  13. 13

    为id EF Core 3.1创建重复的外键和列

  14. 14

    在mongo中使用slug作为主键/ _id的性能劣势?

  15. 15

    cakephp mysql,自动递增id或varchar作为主键

  16. 16

    如何通过Sails js使用bigserial作为主键ID

  17. 17

    使用UUID作为主键时,Hibernate的ID值错误

  18. 18

    使用 Guid 作为主键和外键 Sqllite C#

  19. 19

    尝试更新作为主键和其他表的外键的数据库属性

  20. 20

    原始SQL查询和Entity Framework Core

  21. 21

    创建在同一时间实体和相关实体id作为主键

  22. 22

    ASP.NET Core MVC + Entity Framework Core如何获取新添加的对象的ID

  23. 23

    作为主键给出的一组属性的外键

  24. 24

    使用Entity Framework Core在部分主键上自动递增

  25. 25

    如何使用Entity Framework Core删除没有外键的相关数据

  26. 26

    .net core 2 Entity Framework - ApplicationUser 扩展外键对象未在获取时填充

  27. 27

    CakePHP-主键问题,如何覆盖默认的“ id”字段作为主键

  28. 28

    CakePHP-主键问题,如何覆盖默认的“ id”字段作为主键

  29. 29

    属性为null,导致NullReferenceException,但Entity Framework数据库中的主键和外键正确且彼此完全匹配

热门标签

归档