实体框架抛出无效的列名User_Id错误

本文关键字:User Id 错误 框架 无效 实体 | 更新日期: 2023-09-27 18:12:05

我正在尝试创建和关联我的项目中的实体。用户可以有多个角色、声明和登录。另一方面,一个声明或登录只能有一个用户,而一个角色也可以有多个用户。我用fluent API定义了关系:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    modelBuilder.Entity<User>().HasMany(u => u.Claims).WithRequired(cl => cl.User).Map(m => m.MapKey("User"));
    modelBuilder.Entity<Claim>().HasRequired(cl => cl.User).WithMany(u => u.Claims).Map(m => m.MapKey("User"));
    modelBuilder.Entity<User>().HasMany(u => u.Logins).WithRequired(lg => lg.User).Map(m => m.MapKey("User"));
    modelBuilder.Entity<Login>().HasRequired(lg => lg.User).WithMany(u => u.Logins).Map(m => m.MapKey("User"));
    modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany(ro => ro.Users).Map(userRoles => 
    {
        userRoles.ToTable("Users_Roles");
        userRoles.MapLeftKey("User");
        userRoles.MapRightKey("Role");
    });     
    modelBuilder.Entity<Role>().HasMany(ro => ro.Users).WithMany(u => u.Roles).Map(userRoles => 
    {
        userRoles.ToTable("Users_Roles");
        userRoles.MapLeftKey("User");
        userRoles.MapRightKey("Role");
    }); 
}

如你所见,我的数据库表不遵循实体框架的约定,而不是使用'User_Id'作为外键,外键被简单地命名为'User'。然而,我一直得到这个"无效列名:User_Id"异常消息。

我试图通过调用Map()和MapKey()方法用上面的代码定义外键列名,但没有占上风。为什么会发生这种情况?我是否写错了映射代码?有人能帮忙吗?

PS:异常错误消息非常没有帮助,我不知道这个列名错误与哪个表相关联。有人知道如何使异常消息显示表名,而不仅仅是列名吗?谢谢。

我还添加了用于Claim, Login和Role实体的代码(删除了不相关的方法)。

public class Claim
{
    public string Id { get; protected set; }
    public string Type { get; protected set; }
    public string Value { get; protected set; }
    public virtual User User { get; protected set; }
    public Claim() { }
    public Claim(string id, User user, string type, string value)
    {
        Id = id;
        User = user;
        Type = type;
        Value = value;
    }
}
public class Login
{
    public string Id { get; protected set; }
    public string Provider { get; protected set; }
    public string Key { get; protected set; }
    public DateTime? DateLoggedin { get; protected set; }
    public virtual User User { get; protected set; }
    public Login() { }
    public Login(string id, string provider, string key, DateTime? dateLoggedIn = null)
    {
        Id = id;
        Provider = provider;
        Key = key;
        DateLoggedin = dateLoggedIn;
    }
}
public class Role
{
    public string Id { get; protected set; }
    public string Title { get; protected set; }
    public string Description { get; protected set; }
    public bool IsAdmin { get; protected set; }
    public bool IsBanned { get; protected set; }
    public IList<User> Users { get; protected set; }
    public Role() { }
    public Role(string id, string title, string description, bool isAdmin, bool isBanned)
    {
        Id = id;
        Title = title;
        Description = description;
        IsAdmin = isAdmin;
        IsBanned = isBanned;
    }
}

实体框架抛出无效的列名User_Id错误

User_Id列是按照EF约定创建的,因为您将键映射到与导航属性同名的属性。

你可以删除。map()部分,让EF处理键,或者在Claim和Login类上定义一个键属性,然后映射到fluent api中。我个人倾向于后者。

例句:

public class Claim
{
public string Id { get; protected set; }
public string Type { get; protected set; }
public string Value { get; protected set; }
public virtual User User { get; protected set; }
public int UserId{get;set;}
public Claim() { }
}

在ModelCreating

modelBuilder.Entity<User>().HasMany(a=>a.Claims).WithRequired(a=>a.User).HasForeignKey(a=>a.UserId);

如果你创建了一个'EntityNameId' (UserId, ClaimId等)的键字段,那么EF约定将自动将其映射为外键,而不需要流畅的映射。但是,如果您的名称是其他内容(UsernameId或其他内容),则必须显式地提供映射。请大家阅读一下