在没有主键的实体中使用表(使用实体代码优先迁移)

时间:2015-08-14 13:12:12

标签: c# sql asp.net-mvc entity-framework

我有一个现有的表(在SQL服务器中),我需要在没有主键的解决方案中使用。它有一个唯一的字段,它用作键,但从未设置为PK。我问我的老板,他说我们不能改变它。如何将该字段用作主键,即使它没有标记为主键?

我正在使用代码首次迁移。

我在搜索时发现了这个?但所有的答案都是指一个观点,而不是一张桌子。

Entity Framework: table without primary key

这是我的模特:

public partial class STCIProductInteractiveInfo
    {

        public Guid STCIProductInteractiveInfoID { get; set; }

        public Guid MarketingTextID { get; set; }

        public DateTime ModifyDate { get; set; }

        public int ModifyUserID { get; set; }

        public string STCICourseID { get; set; }

        public string STCICourseName { get; set; }

        public byte STCIProductEmailHTML { get; set; }

        public string STCIProductEmailHTMLDateType { get; set; }

        public int STCIProductEmailHTMLFileLength { get; set; }

        public byte STCIProductEmailText { get; set; }

        public string STCIProductEmailTextDataType { get; set; }

        public string STCIProductEmailTextFileLength { get; set; }

        public string STCITrackingClassCode { get; set; }

        public string STCITrackingClassName { get; set; }

        public int u_product_id { get; set; }

    }

在标记STCIProductInteractiveInfoID之后:

[Key]
public Guid STCIProductInteractiveInfoID { get; set; }

我收到此错误:

  

引用的表中没有主键或候选键   与引用列匹配的“dbo.STCIProductInteractiveInfo”   在外键中列出   'FK_dbo.PTEInteractiveCourses_dbo.STCIProductInteractiveInfo_STCIProductInteractiveInfoID'。   无法创建约束。查看以前的错误。

我已将此代码放在DataContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

            // Add Primary key for STCIProductInteractiveInfo
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<STCIProductInteractiveInfo>().HasKey(x => new { x.STCIProductInteractiveInfoID });
        }

并根据要求提供我的PTEInteractiveCourse模型:

namespace PTEManager.Domain
{
    public class PTEInteractiveCourse
    {
        [Key]
        public Guid PTEInteractiveCourseId { get; set; }

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

        [ScaffoldColumn(false)]
        [Display(Name = "")]
        [Required]
        public int Status { get; set; }

        [Display(Name = "STCI Course")]
        [ForeignKey("STCICourseName")]
        [Required]
        public Guid STCIProductInteractiveInfoID { get; set; }

        public virtual STCIProductInteractiveInfo STCICourseName { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

如果该字段包含唯一数据,您可以在EF中将其标记为Key并禁用所有自动迁移。它应该工作。

修改
您必须禁用所有迁移,因为如果EF尝试构建缺少的对象,则无法进行迁移 最后,您将没有最高性能的数据库,您还需要自己实现参照完整性约束。

<强> EDIT2
这里的问题是SQL Server,因为EF试图创建从PTEInteractiveCourse.STCIProductInteractiveInfoID到STCIProductInteractiveInfo的关系,该关系实际上没有主键(EF认为它有,但它不是真的)。您应该尝试禁用所有自动迁移。看这里这样做How can I disable migration in Entity Framework 6.0