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

本文关键字:实体 代码 迁移 | 更新日期: 2023-09-27 18:07:53

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

我正在使用代码优先迁移。

我在搜索时发现了这个?但是所有的答案都指向一个视图,而不是一个表。

实体框架:没有主键的表

这是我的模型:
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 });
        }
这里是我的pteinteractiveccourse模型:
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; }
    }
}

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

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

编辑
你必须禁用所有的迁移,因为如果EF试图构建丢失的对象,它将无法。
最后,你将不会拥有最高性能的数据库,而且你还需要自己实现引用完整性约束。

EDIT2
这里的问题是SQL Server,因为EF试图从pteinteractiveccourse创建关系。STCIProductInteractiveInfoID到STCIProductInteractiveInfo,没有真正的主键(EF认为它有,但它不是真的)。您应该尝试禁用所有的自动迁移。如何在Entity Framework 6.0中禁用迁移