C# CodeFirst表没有像我预期的那样生成

C# CodeFirst表没有像我预期的那样生成,c#,entity-framework,entity-framework-4,entity-framework-4.1,ef-code-first,C#,Entity Framework,Entity Framework 4,Entity Framework 4.1,Ef Code First,我有一个名为Status的类,还有一个名为applicationpositionhistory的类,它有一个OldStatus和一个NewStatus 但是,该表是这样生成的: 我希望该表有一个newstatusid和oldstatusid,它们应该是外键,但它生成了两个重复的列 public class ApplicationPositionHistory { [DatabaseGenerated(System.ComponentModel.DataAnnotati

我有一个名为Status的类,还有一个名为applicationpositionhistory的类,它有一个OldStatus和一个NewStatus

但是,该表是这样生成的:

我希望该表有一个newstatusid和oldstatusid,它们应该是外键,但它生成了两个重复的列

 public class ApplicationPositionHistory
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int ApplicationPositionHistoryID { get; set; }

        public ApplicantPosition applicantPosition { get; set; }

        [Column("oldStatusID")]
        public int oldStatusID { get; set; }

        [Column("newStatusID")]
        public int newStatusID { get; set; }

        public Status oldStatus { get; set; }

        public Status newStatus { get; set; }

        [StringLength(500, MinimumLength = 3, ErrorMessage = "Comments  should not be longer than 500 characters.")]
        [Display(Name = "Comments")]
        public string comments { get; set; }

        [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
        [Display(Name = "Date")]     
        public DateTime dateModified { get; set; }
    }

    public class Status
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
        public int StatusID { get; set; }

        [StringLength(40, MinimumLength = 3, ErrorMessage = "Status  should not be longer than 20 characters.")]
        [Display(Name = "Status")]
        public string status { get; set; }

    }

我认为问题在于您的非标准命名约定,这会导致在应用默认映射约定时出现问题,因此您的FK列不会与导航属性配对,EF会创建新的属性

尝试以下操作以手动将导航属性与FK属性配对:

[ForeignKey("oldStatusID")]
public Status oldStatus { get; set; }

[ForeignKey("newStatusID")]
public Status newStatus { get; set; }

我认为问题在于您的非标准命名约定,这会导致在应用默认映射约定时出现问题,因此您的FK列不会与导航属性配对,EF会创建新的属性

尝试以下操作以手动将导航属性与FK属性配对:

[ForeignKey("oldStatusID")]
public Status oldStatus { get; set; }

[ForeignKey("newStatusID")]
public Status newStatus { get; set; }

这是我运行应用程序时得到的结果。在表“ApplicationPositionHistory”上引入外键约束“ApplicationPositionHistory\u oldStatus”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。\r\n无法创建约束。请参阅前面的错误。“}我可以使用.modelBuilder.Conventions.Remove()修复此问题;在OnModelCreating中,这可能发生,但只能通过-属性解决。属性不提供关闭级联删除的方法。删除约定将关闭级联删除。这是我在所有数据库中想要的。我发现了一篇关于所有fluent api示例的好博文,我确信在发布任何其他示例之前,我会检查它r关于数据库创建的问题。将粘贴到此处供将来的访问者参考。这是我运行应用程序时得到的结果。在表“ApplicationPositionHistory”上引入外键约束“ApplicationPositionHistory\u oldStatus”可能会导致循环或多个级联路径。请在删除时指定“无操作”,或在更新时指定“无操作”,或修改其他外键约束。\r\n无法创建约束。请参阅以前的错误。“}我可以用修复此问题。modelBuilder.Conventions.Remove();在OnModelCreating中,这可能发生,但只能通过-属性解决。属性不提供关闭级联删除的方法。删除约定将关闭级联删除。这是我在所有数据库中想要的,我发现了一篇关于所有fluentapi示例的好博客文章,我相信在发布关于数据库创建的任何其他问题之前,我会先检查一下。我会把它贴在这里,供将来的访客参考。