在没有主键的实体中使用表(使用实体代码优先迁移)
本文关键字:实体 代码 迁移 | 更新日期: 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中禁用迁移