Entity Framework 6多标识列错误及MVC Code-First数据库更新问题
作为MVC新手用Code-First踩这些坑太正常啦,我帮你拆解下遇到的两个问题的解决办法:
一、解决「无法确定有效启动项目」的问题
你看到的Cannot determine a valid start-up project. Using project 'Project_Zyoos' instead.提示,本质是Package Manager Console(PMC)不知道该用哪个项目来加载数据库配置(比如appsettings.json里的连接字符串)。解决方法有两种:
临时指定启动项目执行命令:
在PMC的「默认项目」下拉框选中你的数据访问项目(就是包含DbContext类的那个项目),然后执行带参数的迁移命令:update-database -StartupProject Project_Zyoos这里的
Project_Zyoos要换成你的Web/API项目名称,确保它包含数据库连接配置。设置解决方案默认启动项目:
右键你的解决方案→选择「属性」→在「启动项目」选项卡中,选择「单启动项目」,选中你的Web/API项目(比如Project_Zyoos),点击确定。之后直接执行update-database就不会再出现这个提示了。
二、解决「多标识列」的问题(适配新版EF)
不管EF版本怎么更新,SQL Server的规则没变:一个表只能有一个自增标识列(IDENTITY)。你之前查的旧方案没用,大概率是新版EF的配置方式变了,给你说下新版通用的排查和解决步骤:
检查实体类的DataAnnotations配置:
确保你的实体类里,只有一个主键字段标记了[DatabaseGenerated(DatabaseGeneratedOption.Identity)]。比如下面的错误写法会触发多标识列错误:public class Product { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // 错误:又给另一个字段加了自增标识 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Code { get; set; } }修正后只保留一个自增主键:
public class Product { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } // 如果需要自动生成,用Computed(比如数据库默认值),不是Identity [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreateTime { get; set; } }检查Fluent API配置:
如果是用Fluent API配置实体,确保只对一个主键列设置.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)。比如错误写法:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Product>() .HasKey(p => p.Id) .Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); // 错误:给另一个列也设置了自增 modelBuilder.Entity<Product>() .Property(p => p.Code).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); }删掉多余的自增配置即可。
复合主键的特殊情况:
如果你的实体用了复合主键,那复合主键里的所有字段都不能设置为自增标识列——SQL Server不支持复合标识列,你需要手动给这些主键赋值,或者换用单个自增主键+其他业务字段的设计。
内容的提问来源于stack exchange,提问作者saswat prusty

