【问题标题】:"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 是枚举还是类?

标签: c# entity-framework-core database-migration entity-framework-migrations blazor-server-side


【解决方案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.")]
````

【讨论】:

  • 我尝试了第一个选项,现在可以了。我能够创建迁移。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2020-02-09
  • 1970-01-01
相关资源
最近更新 更多