在EF6中建模外键的复合键(建模为实体引用)

山姆

我来自nHibernate,正在尝试创建一个具有2列复合键的实体,其中两列均为外键。

例如,我有一个UserRole表,它是(UserId Guid,RoleId Guid)。建模为

public class UserRole
{
  public User User { get; set; }
  public Role Role { get; set; }
}

EF似乎并不喜欢这个想法。似乎要我也加上Guid UserId {get;set;}Guid RoleId { get; set; }通过在dbcontext中定义模型,我设法解决了FK部分的处理问题,如下所示:

        modelBuilder.Entity<UserRole>()
            .HasRequired(x => x.Role)
            .WithRequiredPrincipal()
            .Map(x => x.MapKey("RoleId"));

        modelBuilder.Entity<UserRole>()
            .HasRequired(x => x.User)
            .WithRequiredPrincipal()
            .Map(x => x.MapKey("UserId"));

我希望我可以成为一个惯例。但是,当我也尝试这样做时:

modelBuilder.Entity<UserRole>().HasKey(x => new { x.User, x.Role });

它在运行时出现以下问题:

The property 'User' cannot be used as a key property on the entity 'Paroxysm.Domain.UserRole' because the property type is not a valid key type. Only scalar types, string and byte[] are supported key types.

仅供参考,这是在nHibernate byCode映射中完成的(如下所示)(略有不同):

public class ProjectUserProfileMap : ClassMap<ProjectUserProfile>
{
    public ProjectUserProfileMap()
    {
        CompositeId()
            .KeyReference(x => x.User, "UserId")
            .KeyReference(x => x.Project, "ProjectId");

        ReadOnly();

        References(x => x.User, "UserId");
        References(x => x.Project, "ProjectId");

        Map(x => x.IsActive);
        Map(x => x.ActivatedUtcDate).Not.Nullable().CustomType<NHibernate.Type.UtcDateTimeType>();
        Map(x => x.InvitedUtcDate).Not.Nullable().CustomType<NHibernate.Type.UtcDateTimeType>();

        Table("ProjectUserProfile");
    }
}

太简单!顺便说一句,EF似乎也不支持几乎没有CustomType UTC行为。

问题实际上与以下事实无关:我有一个复合键,但只有一个单列PK(也为FK)会是一个奇怪的情况(1:1相对)。

因此,我想我想肯定地知道这是否可以在EF6中完成。该错误消息肯定表明其不可行。有人可以确认吗?

MR100

您可以实现此目的,但前提是您必须添加到UserRole 2外键属性:RoleId和UserId。这是因为HasKey不提供任何映射功能-只能在实体类中存在的属性上定义它。似乎EF强制将所有主键列始终定义为类中的具体属性,在这些类中,外键列可能未定义相应的属性。因此,要实现您想要的目标,您需要定义UserRole,如下所示:

public class UserRole
{
    public User User { get; set; }
    public int UserId { get; set; }
    public Role Role { get; set; }
    public int RoleId { get; set; }
}

    modelBuilder.Entity<UserRole>()
        .HasRequired(x => x.Role)
        .WithRequiredPrincipal()
        .HasForeignKey(x => x.RoleId);

    modelBuilder.Entity<UserRole>()
        .HasRequired(x => x.User)
        .WithRequiredPrincipal()
        .HasForeignKey(x => x.UserId);

    modelBuilder.Entity<UserRole>().HasKey(x => new { x.UserId, x.RoleId });

您发布的确切情况可能会通过多对多关系来实现:

    modelBuilder.Entity<User>()
        .HasMany(x => x.Roles)
        .WithMany()
        .Map(m => 
        { 
            m.ToTable("UserRole"); 
            m.MapLeftKey("UserId"); 
            m.MapRightKey("RoleId"); 
        });

这样,您将获得在UserId和RoleId上定义了主键的UserRole表。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF6为可为空的外键生成空子实体

来自分类Dev

EF6 CF中的外键问题

来自分类Dev

在EF6中更新外键对象

来自分类Dev

EF6:复合主键字段作为外键(ALTER TABLE语句与FOREIGN KEY约束冲突)

来自分类Dev

实体框架6复合键(DateTime +外键)

来自分类Dev

Django为多个表建模一个外键

来自分类Dev

sql数据建模器中的外键问题

来自分类Dev

如何在SQL中为自引用实体建模

来自分类Dev

EF中的复合键

来自分类Dev

如何使用外键创建模型?

来自分类Dev

Django使用外键创建模型

来自分类Dev

实体类型没有定义键EF6

来自分类Dev

EF6对外键的唯一约束

来自分类Dev

EF6 ApplicationUser错误的多个外键

来自分类Dev

如何使用 JPA 为具有复合键的查找表建模

来自分类Dev

我可以在EF6中使用外键来唯一约束吗?

来自分类Dev

EF6:在SQL Server DB的模型生成中无法识别外键

来自分类Dev

EF6:在SQL Server DB的模型生成中无法识别外键

来自分类Dev

如何使用EF6 Code First将外键属性公开给具有导航属性的现有实体

来自分类Dev

EF6帮助定义模型的外键(可选的外键和冲突的多重性)

来自分类Dev

MVC建模:表中有多个外键,先编码EF

来自分类Dev

MVC建模:表中有多个外键,代码优先EF

来自分类Dev

在EF Core中,如何使用Fluent API为引用拥有的类型配置外键

来自分类Dev

阻止在EF6中为特定实体生成表

来自分类Dev

可以使用外键在同一表中对父子关系进行建模吗?

来自分类Dev

包含两个外键的表的建模关系

来自分类Dev

EF例外,如何首先在C#和实体框架代码中为地址建模

来自分类Dev

使用 SQLite EF 建模实体

来自分类Dev

创建模型时使用外键自动创建模型-Django

Related 相关文章

热门标签

归档