【问题标题】:ASP.NET Mvc3/VS2010 error: An item with the same key has already been addedASP.NET Mvc3/VS2010 错误:已添加具有相同键的项
【发布时间】:2012-11-26 11:22:44
【问题描述】:

我一直在尝试在我的项目中添加一个控制器,但我收到了错误

An item with the same key has already been added. 

同时这样做。

我仍然是这方面的初学者,所以我可能没有注意到什么,但我没有在我的模型中看到任何重复的键。这是我的数据库图表,可以大致了解我想要做什么做:

我使用Applications 作为Model ClassApplicationServices 作为data Context Class,同时尝试创建我的ApplicationController 并收到错误

An item with the same key has already been added.  

任何想法我可能做错了什么?

我创建的模型如下:

Entity.cs:

using Microsoft.VisualBasic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.ComponentModel.DataAnnotations;

namespace PostGraduate.Models
{
    public class ApplicationServices : DbContext
    {
        public DbSet<Application.Users> Users { get; set; }
        public DbSet<Application.Addresses> Addresses { get; set; }
        public DbSet<Application.Applications> Applications { get; set; }
        public DbSet<Application.ForeignLanguages> ForeignLanguages { get; set; }
        public DbSet<Application.Gmat> Gmat { get; set; }
        public DbSet<Application.PostGradStudies> PostGradStudies { get; set; }
        public DbSet<Application.PreGradStudies> PreGradStudies { get; set; }
        public DbSet<Application.Schoolarships> Schoolarships { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Application.Users>().HasKey(a => a.UserId);
            modelBuilder.Entity<Application.Addresses>().HasKey(a => a.Addresses_Id);
            modelBuilder.Entity<Application.Applications>().HasKey(a => a.Applications_Id);
            modelBuilder.Entity<Application.Applications>().Property(a => a.Applications_Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            modelBuilder.Entity<Application.ForeignLanguages>().HasKey(a => a.ForeignLanguages_Id);
            modelBuilder.Entity<Application.Gmat>().HasKey(a => a.Gmat_Id);
            modelBuilder.Entity<Application.Gmat>().Property(a => a.Gmat_Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            modelBuilder.Entity<Application.PostGradStudies>().HasKey(a => a.PostGradStudies_Id);
            modelBuilder.Entity<Application.PostGradStudies>().Property(a => a.PostGradStudies_Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            modelBuilder.Entity<Application.PreGradStudies>().HasKey(a => a.PreGradStudies_Id);
            modelBuilder.Entity<Application.Schoolarships>().HasKey(a => a.Schoolarships_Id);
            modelBuilder.Entity<Application.Schoolarships>().Property(a => a.Schoolarships_Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

            modelBuilder.Entity<Application.Users>().HasRequired(a => a.Applications).WithRequiredPrincipal(i => i.Users);
            modelBuilder.Entity<Application.Applications>().HasMany(a => a.Addresses).WithRequired(i => i.Applications).HasForeignKey(i => i.Application_Id);
            modelBuilder.Entity<Application.Applications>().HasMany(a => a.ForeignLanguages).WithRequired(i => i.Applications).HasForeignKey(i => i.Application_Id);
            modelBuilder.Entity<Application.Applications>().HasOptional(a => a.Gmat).WithRequired(i => i.Applications);
            modelBuilder.Entity<Application.Applications>().HasOptional(a => a.PostGradStudies).WithRequired(i => i.Applications);
            modelBuilder.Entity<Application.Applications>().HasMany(a => a.PreGradStudies).WithRequired(i => i.Applications).HasForeignKey(i => i.Application_Id);
            modelBuilder.Entity<Application.Applications>().HasOptional(a => a.Schoolarships).WithRequired(i => i.Applications);

        }
    }
}

Applications.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class Applications
    {

        public Applications()
        {
            this.Addresses = new HashSet<Addresses>();
            this.PreGradStudies = new HashSet<PreGradStudies>();
            this.ForeignLanguages = new HashSet<ForeignLanguages>();
        }

        internal void BuildAddress(int p)
        {
            for (int i = 0; i < p; i++)
            {
                Addresses.Add(new Addresses());
            }
        }

        internal void BuildPreGradStudies (int p)
        {
            for (int i = 0; i < p; i++)
            {
                PreGradStudies.Add(new PreGradStudies());
            }
        }

        internal void BuildForeignLanguages(int p)
        {
            for (int i = 0; i < p; i++)
            {
                ForeignLanguages.Add(new ForeignLanguages());
            }
        }

        public virtual Users Users { get; set; }
        public virtual Gmat Gmat { get; set; }
        public virtual PostGradStudies PostGradStudies { get; set; }
        public virtual Schoolarships Schoolarships { get; set; }
        public virtual ICollection<Addresses> Addresses { get; set; }
        public virtual ICollection<PreGradStudies> PreGradStudies { get; set; }
        public virtual ICollection<ForeignLanguages> ForeignLanguages { get; set; }

        [ScaffoldColumn(false)]
        public string Applications_Id { get; set; }

        [ScaffoldColumn(false)]
        public DateTime ApplicationDate { get; set; }

        [Required]
        public string FathersName { get; set; }

        [Required]
        public DateTime? Birthdate { get; set; }

        [Required]
        public string Birthplace { get; set; }

        [Required]
        public string Identification { get; set; }

        [Required]
        public string Country { get; set; }

        [Required]
        public string MobileNumber { get; set; }

        [Required]
        public string Profession { get; set; }

        public string Activity { get; set; }

        public string PostGradExtra { get; set; }

        public string PostGradReapplication { get; set; }

        public string ExtraInformation { get; set; }

        [Required]
        public string PostGradSource { get; set; }
    }
}

Addresses.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class Addresses
    {
        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string Addresses_Id { get; set; }

        [ScaffoldColumn(false)]
        public string Application_Id { get; set; }

        [Required]
        public string StreetAddress { get; set; }

        [Required]
        public string City { get; set; }

        [Required]
        public string PostalCode { get; set; }

        [Required]
        public string PhoneNumber { get; set; }
    }
}

ForeignLanguages.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class ForeignLanguages
    {

        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string ForeignLanguages_Id { get; set; }

        [ScaffoldColumn(false)]
        public string Application_Id { get; set; }

        public string Language { get; set; }

        public string LanguageDegree { get; set; }

        public string Admission { get; set; }

        public bool Delete { get; set; }
    }
}

Gmat.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class Gmat
    {
        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string Gmat_Id { get; set; }

        public DateTime? GmatDate { get; set; }

        public string GmatGrade { get; set; }
    }
}

PostGradStudies.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class PostGradStudies
    {
        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string PostGradStudies_Id { get; set; }

        public string Aei { get; set; }

        public string PostGradTitle { get; set; }

        public string PostGradLength { get; set; }

        public string PostGradGrade { get; set; }

        public string PostGradProject { get; set; }

        public string PostGradProjectGrade { get; set; }
    }
}

PreGradStudies.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class PreGradStudies
    {
        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string PreGradStudies_Id { get; set; }

        [ScaffoldColumn(false)]
        public string Application_Id { get; set; }

        public string University { get; set; }

        public string Department { get; set; }

        public string Admission { get; set; }

        public string Graduation { get; set; }

        public string DegreeGrade { get; set; }

        public string ThesisSubject { get; set; }

        public string ThesisGrade { get; set; }

        public bool Delete { get; set; }
    }
}

Scholarships.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class Schoolarships
    {
        public virtual Applications Applications { get; set; }

        [ScaffoldColumn(false)]
        public string Schoolarships_Id { get; set; }

        public string Schoolar { get; set; }

        public string SchoolarshipProfession { get; set; }

        public string SchoolarshipInstitution { get; set; }
    }
}

Users.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;

namespace PostGraduate.Models.Application
{
    public class Users
    {
        public virtual Applications Applications { get; set; }

        public string UserId { get; set; }

        public string UserName { get; set; }
    }
}

【问题讨论】:

    标签: asp.net asp.net-mvc-3


    【解决方案1】:

    您能否也包含您的Application Controller 代码?

    但我怀疑,这可能是因为您的某些实体被定义为没有自动生成的主键,当它们创建对象时,它们都将具有相同的键。

    我会假设所有的键都设置为空字符串或 NULL,所以当使用 NULL 键检查其他内容时,它已经得到匹配...

    (对不起,我对 EF 的理解不是最好的,只是一个想法!)

    【讨论】:

      【解决方案2】:

      发生这种情况的原因之一是如果您在视图模型中拥有两次相同的属性。例如,如果您在一个班级上有UserName,而您在另一个班级上有它,并且两者都出现在您的视图中。这将创建一个重复的 UserName 键。

      当我在一个类中有两个同名的属性时,我遇到了这种情况。一个是公共字段成员,另一个是 get/set 访问器

      public class User
      {
         public string userName;  // <---- this should be private
      
         public string UserName
         {
           get { return userName; }
           set { userName = value; }
         }
      }
      

      注意 C# 不会因为区分大小写而抱怨。我通过使字段变量private

      解决了这个问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 2011-03-01
        • 2013-03-18
        • 2021-05-14
        • 2017-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多