C# 在asp.net Razor引擎中创建新记录时出错

C# 在asp.net Razor引擎中创建新记录时出错,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我的数据库中有两个表。第一个是我的学生,另一个是我的课程。我使用.net的entityframework,并在Visual Studio中创建了一个名为“BestModel”的模型。这是我的课 MyStudent.cs namespace tt.Models { using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; p

我的数据库中有两个表。第一个是我的学生,另一个是我的课程。我使用.net的entityframework,并在Visual Studio中创建了一个名为“BestModel”的模型。这是我的课

MyStudent.cs

namespace tt.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;

    public partial class MyStudent
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public MyStudent()
        {
            this.MyCourse = new HashSet<MyCourse>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        [ForeignKey("MyCourse")]
        public Nullable<int> CourseId { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<MyCourse> MyCourse { get; set; }
    }
}
这是我的创建函数

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Title")] MyCourse myCourse)
        {
            if (ModelState.IsValid)
            {
                MyStudent st = new MyStudent();
                st.Id = 10;
                st.CourseId = 1;

                st.Name = "sadasd".ToString();

                myCourse.MyStudent.Add(st); // when this line commented everything is fine.. .


                db.MyCourse.Add(myCourse);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(myCourse);
        }
我在上面指定了这个问题的兴趣线。当我想创建一个新记录时,它会告诉我“更新条目时出错。有关详细信息,请参阅内部异常。”但当我禁用该行“myCourse.MyStudent.Add(st);”时,一切都很好。我认为问题在于这两个表和外键之间的关系。请帮帮我

编辑

类之间的关系是多对多的

EDIT2

例外是这样的


System.Data.Entity.Core.UpdateException:更新条目时出错。有关详细信息,请参见内部异常。-->System.Data.SqlClient.SqlException:INSERT语句与外键约束“FK__MyStudent__Cours__35BCFE0A”冲突。冲突发生在数据库“MyDB”、表“dbo.MyCourse”、列“Id”中。声明已终止。System.Data.SqlClient.SqlConnection.OneError(SqlException异常,布尔断开连接,Action
1 wrapCloseInAction)System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接,Action
1 wrapCloseInAction)System.Data.SqlClient.TdsParser.ThroweException和WarningSystem.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject StateObjection,Boolean&dataReady)上的(SqlDataReader ds、RunBehavior RunBehavior、String ResetOptions String、Boolean isInternal、Boolean ForDescriptionParameterEncryption)位于System.Data.SqlClient.SqlCommand.RunExecuteReaderDS(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async、Int32超时、任务和任务、Boolean asyncWrite、Boolean inRetry、SqlDataReader ds、Boolean describeParameterEncryptionRequest)位于System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法、TaskCompletionSource
1 completion、Int32超时、任务和任务、Boolean和usedCache、Boolean asyncWrite、Boolean inRetry)位于System.Data.SqlClient.SqlCommand.InternalExecuteInQuery(System.Data.SqlClient.SqlCommand.ExecuteNonQuery()中的System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.b_0(DbCommand t,DbCommandInterceptOnContext
1 c)中的TaskCompletionSource在System.Data.Entity.Infrastructure.Interception.InternalDispatcher中,在System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery中,在System.Data.Entity.Infrastructure中,在System.Data.Entity.Interception.Infrastructure.Interception.InternalDispatcher中,在System.Data.Data.Entity.Interception.Interception中,在System.Data.Data.Entity.Interception.Interception在System.Data.Entity.Core.Mapping.Update.Internal.DynamicCupDateCommand.ExecuteQuery()的System.Data.Entity.Internal.InterceptableDbCommand.ExecuteOnQuery()中执行(Dictionary
2个IdentifierValue,List
1个GeneratedValue)位于System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update()---内部异常堆栈跟踪的结尾---位于System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update(),位于System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.b_u2(UpdateTranslator ut)在System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T](T noChangesResult,Func
2 updateFunction)在System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update()在System.Data.Entity.Core.Objects.ObjectContext.b_u35()在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func
1 Func,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction,Boolean releaseConnectionOnSuccess)位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction)在System.Data.Entity.Core.Objects.ObjectContext.c__中在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func
1操作)中在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal中显示Class2A.b___27()(SaveOptions选项,布尔executeInExistingTransaction)在System.Data.Entity.InternalContext.SaveChanges()中的System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions选项)看起来您有一个
多对多
关系,但没有联接表。您需要第三个表来存储来自
MyStudent
MyCourse
表的
Id
以映射记录。我不能保证语法是100%正确的,但这会给您一个非常好的主意

CREATE TABLE [dbo].[MyStudent] (
    [Id]   INT           NOT NULL,
    [Name] NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyCourse] (
    [Id]    INT           NOT NULL,
    [Title] NVARCHAR (50) NULL,
    [StudentId] INT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyStudentCourses] (
    [CourseId] INT NOT NULL,
    [StudentId] INT NOT NULL,
    FOREIGN KEY (CourseId) REFERENCES MyCourse(Id),
    FOREIGN KEY (StudentId) REFERENCES MyStudent(Id)
);

看起来您有一个
many-to-many
关系,但没有联接表。您需要第三个表来存储
MyStudent
MyCourse
表中的
Id
s来映射记录。我不能保证语法100%正确,但这应该会给您一个非常好的主意

CREATE TABLE [dbo].[MyStudent] (
    [Id]   INT           NOT NULL,
    [Name] NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyCourse] (
    [Id]    INT           NOT NULL,
    [Title] NVARCHAR (50) NULL,
    [StudentId] INT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyStudentCourses] (
    [CourseId] INT NOT NULL,
    [StudentId] INT NOT NULL,
    FOREIGN KEY (CourseId) REFERENCES MyCourse(Id),
    FOREIGN KEY (StudentId) REFERENCES MyStudent(Id)
);

默认情况下,联接表使用由关系两侧的外键组成的复合键。您得到的错误意味着您要保存的特定组合已经有一个条目。现在,您似乎正在将每个新学生的id设置为10,这在第一个阶段没有任何意义地方。当然,一旦你运行过一次,任何
CREATE TABLE [dbo].[MyStudent] (
    [Id]   INT           NOT NULL,
    [Name] NVARCHAR (50) NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyCourse] (
    [Id]    INT           NOT NULL,
    [Title] NVARCHAR (50) NULL,
    [StudentId] INT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

CREATE TABLE [dbo].[MyStudentCourses] (
    [CourseId] INT NOT NULL,
    [StudentId] INT NOT NULL,
    FOREIGN KEY (CourseId) REFERENCES MyCourse(Id),
    FOREIGN KEY (StudentId) REFERENCES MyStudent(Id)
);