实体框架导航属性错误 [英] Entity Framework Navigation Property Error

查看:390
本文介绍了实体框架导航属性错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的.Net MVC 4 Web应用程序收到此错误:

I am getting this error in my .Net MVC 4 web application:

The property 'Username' cannot be configured as a navigation property. The 
property must be a valid entity type and the property should have a non-abstract 
getter and setter.  For collection properties the type must implement 
ICollection<T> where T is a valid entity type.

我很新的实体框架和我似乎无法来解决这个问题。下面是一些code:

I am very new to Entity Framework and I can't seem to get around this issue. Here is some code:

//DB Context
public class EFDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {
        modelBuilder.Entity<User>().HasMany(u => u.Roles).WithMany(r => r.Users).Map(x => x.MapLeftKey("Username").MapRightKey("RoleName").ToTable("Users_Roles"));
    }  

}

//Entity Classes

public class User
{
    [Key]
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public string Comment { get; set; }
    public int Level { get; set; }
    public string PasswordQuestion { get; set; }
    public string PasswordAnswer { get; set; }
    public bool IsApproved { get; set; }
    public DateTime LastActivityDate { get; set; }
    public DateTime LastLoginDate { get; set; }
    public DateTime LastPasswordChangedDate { get; set; }
    public DateTime CreationDate { get; set; }
    public bool IsOnLine { get; set; }
    public bool IsLockedOut { get; set; }
    public DateTime LastLockedOutDate { get; set; }
    public int FailedPasswordAttemptCount { get; set; }
    public DateTime FailedPasswordAttemptWindowStart { get; set; }
    public int FailedPasswordAnswerAttemptCount { get; set; }
    public DateTime FailedPasswordAnswerAttemptWindowStart { get; set; }

    [InverseProperty("RoleName")]
    public virtual ICollection<Role> Roles { get; set; }

    public override string ToString()
    {
        return this.Username;
    }
}

public class Role
{
    [Key]
    public string RoleName { get; set; }
    public int Level { get; set; }

    [InverseProperty("Username")]
    public virtual ICollection<User> Users { get; set; }

    public override string ToString()
    {
        return this.RoleName;
    }

}

//Repository
public class EFUsersRepository : IUsersRepository
{
    private EFDbContext context = new EFDbContext();

    public IQueryable<User> Users
    {
        get { return context.Users; }
    }

    public User GetUser(string username) 
    {
        return context.Users.Find(username); //THIS IS WHERE THE CRASH OCCURS
    }
}

//DB Setup
Table Users, Role and Users_Role. Users_Role is a simple linking table with [username, role] columns both of type varchar.

The database tables columns & types match the two classes above (User,Role).

我继承了这个项目,这是未完成的,但我不能让它成功运行。任何帮助了解什么问题会很有帮助。谢谢!

I inherited this project which was unfinished but I can't get it to run successfully. Any help understanding what the issue is would be helpful. Thanks!

推荐答案

原来,注释掉足够的项目整天之后,下面的线是什么导致了这个错误我:

It turns out, after commenting out enough items all day long, the the following lines are what caused this error for me:

[InverseProperty("RoleName")] //In file User.cs (as shown above)
[InverseProperty("UserName")] //in file Role.cs (as shown above)

我仍然在学习实体框架和我不知道为什么这是解决方案,但它停止我在上面报告的错误。

I am still learning Entity Framework and I don't know why this was the solution, but it stopped the error which I reported above.

我希望这可以帮助别人,如果有人想帮助我了解什么问题是详细,请随意。我渴望学习。

I hope that this helps someone else and if anyone wants to help me understand what the issue was in detail, please feel free. I am eager to learn.

这篇关于实体框架导航属性错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆