添加迁移期间的“无主键”消息

Posted

技术标签:

【中文标题】添加迁移期间的“无主键”消息【英文标题】:"No primary key" message during Add-Migration 【发布时间】:2021-08-11 13:04:23 【问题描述】:

我创建了一个 ASP.NET Blazor 服务器项目。

我创建了一个模型类、一个服务类和一个 DbContext 类。 我还创建了一个 SQL 数据库并在 appsettings.json 和 startup.cs 上连接到它。

下面是我在 Startup.cs 中 IConfiguration Configuration get; 下的代码:

services.AddScoped<ClassNameService>();  //connect to business logic 
            #region Connection String   
            services.AddDbContext<AppDBContext>(item => item.UseSqlServer(Configuration.GetConnectionString("DatabaseName"))); 
            #endregion

当我在包管理器控制台中输入以下代码时:

Add-Migration DatabaseName -Context DbContextName 我收到以下错误消息:

实体类型“DisplayFormatAttribute”需要定义一个主键。如果您打算使用无密钥实体类型,请在“OnModelCreating”中调用“HasNoKey”。有关无密钥实体类型的更多信息,请参阅https://go.microsoft.com/fwlink/?linkid=2141943。

问题是我确实在 ModelName.cs 中有一个主键:

public class ContactPerson 
 
    [Key] 
    public int Id  get; set; 
    public string Title  get; set;  
    public string FirstName  get; set;  
    public string LastName  get; set;  
    public string Designation  get; set;  
    public string Company  get; set; 
    public PhoneAttribute Mobile  get; set;  
    public PhoneAttribute Landline  get; set;  
    public EmailAddressAttribute Email  get; set;  
    public string Address  get; set;  

Id 是这里的主键。

下面是 DbContext 和 Service 类代码:

public class AppDBContext:DbContext 
     
        public AppDBContext(DbContextOptions<AppDBContext> options) : base(options) 
         
         
        public DbSet<ContactPerson> ContactPeople  get; set;  
     
public class ContactPersonService 
     
        #region Property   
        private readonly AppDBContext _appDBContext; 
        #endregion 

        #region Constructor   
        public ContactPersonService(AppDBContext appDBContext) 
         
            _appDBContext = appDBContext; 
         
        #endregion 

        #region Get List of ContactPeople   
        public async Task<List<ContactPerson>> GetAllContactPeopleAsync() 
         
            return await _appDBContext.ContactPeople.ToListAsync(); 
         
        #endregion 

        #region Insert ContactPerson   
        public async Task<bool> InsertContactPersonAsync(ContactPerson contactperson) 
         
            await _appDBContext.ContactPeople.AddAsync(contactperson); 
            await _appDBContext.SaveChangesAsync(); 
            return true; 
         
        #endregion 

        #region Get ContactPerson by Id   
        public async Task<ContactPerson> GetContactPersonAsync(int Id) 
         
            ContactPerson contactperson = await _appDBContext.ContactPeople.FirstOrDefaultAsync(c => c.Id.Equals(Id)); 
            return contactperson; 
         
        #endregion 

        #region Update ContactPerson   
        public async Task<bool> UpdateContactPersonAsync(ContactPerson contactperson) 
         
            _appDBContext.ContactPeople.Update(contactperson); 
            await _appDBContext.SaveChangesAsync(); 
            return true; 
         
        #endregion 

        #region DeleteContactPerson   
        public async Task<bool> DeleteContactPersonAsync(ContactPerson contactperson) 
         
            _appDBContext.Remove(contactperson); 
            await _appDBContext.SaveChangesAsync(); 
            return true; 
         
        #endregion 
     

那么为什么我会收到此错误消息以及如何解决此问题?

【问题讨论】:

什么只有一张桌子?为什么您决定 ContactPerson 导致错误?例如,我看到您有 PhoneAttribute 。是枚举吗? @Serge 一旦这部分工作正常,我将添加更多表格。我假设问题可能出在 ContactPerson 中,但我不确定。 PhoneAttribute 是 System.ComponentModel.DataAnnotations 命名空间中的一个类。 如果 PhoneAttribute 是一个类,则需要修复 ContactPerson 类。这是一个错误。请发布其余的课程。 @Serge 我贴出来了。 谢谢,但我说的是课程。您的 dbcontext 中是否只有 public DbSet ContactPeople 而没有其他内容?抱歉,我得再问一次 PhoneAttribute 是枚举还是类? 【参考方案1】:

您的类包含一些无效属性。您不能将数据注释属性用作属性类型。作为第一种方法,您可以用字符串替换属性:

public class ContactPerson 
     
        [Key] 
        public int Id  get; set; 
        public string Title  get; set;  
        public string FirstName  get; set;  
        public string LastName  get; set;  
        public string Designation  get; set;  
        public string Company  get; set; 
        [Phone]
        public string MobilePhoneNumber  get; set;  
        [Phone]
        public string LandlinePhoneNumber  get; set;  
        [EmailAddress]
        public string Email  get; set;  
        public string Address  get; set;  
    
````
or you can try this validation for the phones instead of above one
````
[Display(Name = "Your contact number :")]
[Required(ErrorMessage = "A phone number is required.")]
[DataType(DataType.PhoneNumber, ErrorMessage = "Invalid Phone Number")]
[RegularExpression(@"^([0-9]10)$", ErrorMessage = "Invalid Phone Number.")]
````

【讨论】:

我尝试了第一个选项,现在可以了。我能够创建迁移。谢谢

以上是关于添加迁移期间的“无主键”消息的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 迁移到内存表期间出现内存配额错误

用于创建表并在两个字段上添加唯一索引的 Rails 迁移文件在迁移期间似乎被忽略了

在 Core Data 迁移期间添加关系 - 自我参考

NetBeans 中的“无主键”错误

iOS 应用在导航期间迁移到 swift3 后崩溃

迁移期间的 Django 问题 - 懒惰的参考