ASP.NET Mvc3 / VS2010错误:已添加具有相同密钥的项目

时间:2012-12-08 12:15:05

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

我一直在尝试在我的项目中添加一个Controller,但我一直在收到错误

An item with the same key has already been added. 
这样做的时候。

我还是初学者,所以我可能没有注意到某些东西,但是我的模型中没有看到任何重复的密钥。这是我的数据库图,以便大致了解我正在尝试的内容做:

Database Diagram

在尝试创建Applications并收到错误

时,我使用Model Class作为ApplicationServicesdata 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; }
    }
}

Schoolarships.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; }
    }
}

2 个答案:

答案 0 :(得分:0)

您是否也可以添加Application Controller代码?

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

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

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

答案 1 :(得分:0)

如果您在视图模型中拥有两次相同的属性,则可能发生这种情况的原因之一。例如,如果某个类上有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

解决了这个问题