MVC4 Code第一种方法,如何解决以下问题?

时间:2013-11-18 12:37:30

标签: entity-framework asp.net-mvc-4 linq-to-entities

我收到以下错误 在模型生成期间检测到一个或多个验证错误:

\ tSystem.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在关系'UserRoles_Roles'中的角色'UserRoles_Roles_Source'中无效。由于“从属角色”是指关键属性,因此从属角色的多重性的上限必须为“1”。

我的实体和关联的映射定义如下,

public class UserProfile
    {
        public UserProfile()
        {
           UserUserRoles = new List<UserRoles>();       
        }         

        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }      
        public virtual ICollection<UserRoles> UserUserRoles { get; set; } 
    }

 public class Roles
    {
        public Roles()
        {
            RoleUserRoles = new List<UserRoles>();
        }

        public int RoleId { get; set; }
        public string RoleName { get; set; }


        public virtual ICollection<UserRoles> RoleUserRoles { get; set; }
    }

  public class UserRoles
    {
        public int UserId { get; set; }
        public int RoleId { get; set; }


        public virtual UserProfile User { get; set; }
        public virtual Roles Roles { get; set; }

    }

//Mappings

  public UserProfileMap()
        {
            // Primary Key
            HasKey(t => t.UserId);

            // Properties
            Property(t => t.UserName)
                .HasMaxLength(56);     

            // Table & Column Mappings
            ToTable("UserProfile");
            Property(t => t.UserId).HasColumnName("UserId");
            Property(t => t.UserName).HasColumnName("UserName");
        }

public class RolesMap : EntityTypeConfiguration<Roles>
    {
        public RolesMap()
        {
            // Primary Key
            HasKey(t => t.RoleId);

            // Properties
            Property(t => t.RoleName)
                .HasMaxLength(256);       

            // Table & Column Mappings
            ToTable("webpages_Roles");
            Property(t => t.RoleId).HasColumnName("RoleId");
            Property(t => t.RoleName).HasColumnName("RoleName");
        }
    }

public class UserRolesMap : EntityTypeConfiguration<UserRoles>
    {
        public UserRolesMap()
        {
            // Primary Key
            HasKey(t => t.UserId);
            HasKey(t => t.RoleId);          

            // Table & Column Mappings
            ToTable("webpages_UsersInRoles");
            Property(t => t.UserId).HasColumnName("UserId");
            Property(t => t.RoleId).HasColumnName("RoleId");


            // Relationships              
            HasRequired(t => t.User)
                .WithMany(t => t.UserUserRoles)
                .HasForeignKey(d => d.UserId);

            HasRequired(t => t.Roles)
                .WithMany(t => t.RoleUserRoles)
                .HasForeignKey(d => d.RoleId);
        }
    }

我做错了什么?

2 个答案:

答案 0 :(得分:0)

看起来您想在模型之间创建多对多关系。在这种情况下,您不需要类UserRoles,它将在使用此方案时由EF生成:

public class User
{
  // other properties

  public virtual IList<Role> Roles {get;set;}
}

public class Role
{
  // other properties

  public virtual IList<User> Users {get;set;}
}

但是,如果您确实希望UserRoles模型存储其他信息,则需要手动进行映射,例如OnModelCreating()类的DbContext函数。

答案 1 :(得分:0)

根据评论:

组合主键应构建为HasKey(t => new { t.UserId, t.RoleId });