我有一个现有的表(在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; }
}
}
答案 0 :(得分:1)
如果该字段包含唯一数据,您可以在EF中将其标记为Key并禁用所有自动迁移。它应该工作。
修改强>
您必须禁用所有迁移,因为如果EF尝试构建缺少的对象,则无法进行迁移
最后,您将没有最高性能的数据库,您还需要自己实现参照完整性约束。
<强> EDIT2 强>
这里的问题是SQL Server,因为EF试图创建从PTEInteractiveCourse.STCIProductInteractiveInfoID到STCIProductInteractiveInfo的关系,该关系实际上没有主键(EF认为它有,但它不是真的)。您应该尝试禁用所有自动迁移。看这里这样做How can I disable migration in Entity Framework 6.0