【问题标题】:Composite key Entity Framework 7 "The Property Cannot Be added to Entity Type复合键实体框架 7“无法将属性添加到实体类型
【发布时间】:2016-01-08 09:02:05
【问题描述】:

我正在尝试创建一个实体来管理具有角色的组织中用户的成员资格。我想限制用户在组织中只有一个成员资格。我通过创建一个复合键来做到这一点。但是,当我尝试创建初始迁移时出现错误:

InvalidOperationException:无法将属性“User”添加到实体类型“OrganizationLogin”,因为实体类型“OrganizationLogin”上已存在同名导航属性。

会员实体

public class OrganizationLogin
{
    public int OrganizationLoginId { get; set; }
    public OrganizationRole Role { get; set; }
    public Organization Organization { get; set; }
    public OmegaUser User { get; set; } 

}

我尝试定义复合键的 DBContext:

public class OmegaContext : IdentityDbContext<OmegaUser,OmegaRole,int>
{
    public DbSet<Log> Logs { get; set; }
    public DbSet<Organization> Organizations { get; set; }
    public DbSet<OrganizationLogin> OrganizationLogins { get; set; }
    public DbSet<OrganizationRole> OrganizationRoles { get; set; }

    public OmegaContext()
    {

    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<OrganizationLogin>(orgLogin =>
        {
            orgLogin.HasAlternateKey(o => new {o.User, o.Organization});
        });

    }
}

如果我删除 OnModelCreating 代码,则迁移创建成功。

编辑:正如 cmets 中所述,问题在于我引用的是类而不是具有实体键的属性

【问题讨论】:

  • 您应该添加包含UserOrganization 实体的 的属性并引用它们。
  • 试试.HasForeignKey()
  • @Balázs 这就是问题所在,谢谢!
  • @Kracobsen 能否请您在这篇文章的答案中向我们展示最终代码,因为我自己也面临着这个确切的问题。
  • @Martin 我添加了适合我的解决方案

标签: c# entity-framework entity-framework-core


【解决方案1】:

根据要求,这是我的解决方案:

public class OrganizationUnitMember
{
    public int OrganizationUnitMemberId { get; set; }
    public int UserId { get; set; }
    public int OrganizationUnitId { get; set; }
    [ForeignKey("UserId")]
    public virtual OmegaUser User { get; set; }
    [ForeignKey("OrganizationUnitId")]
    public virtual OrganizationUnit OrganizationUnit { get; set; }
    public int RoleId { get; set; }
    [ForeignKey("RoleId")]
    public virtual OrganizationRole Role { get; set; }
}

还有 DbContext:

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<OrganizationUnit>(
            orgUnit =>
            {
                orgUnit.HasOne(ou => ou.Parent)
                    .WithMany(ou => ou.Children)
                    .OnDelete(DeleteBehavior.Restrict)
                    .HasForeignKey(ou => ou.ParentId);
            });
        builder.Entity<OrganizationUnitMember>(member =>
        {
            member.HasAlternateKey(m => new {m.OrganizationUnitId, m.UserId});
        });

    }

我必须添加引用实体的 ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多