添加迁移期间的“无主键”消息
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您的类包含一些无效属性。您不能将数据注释属性用作属性类型。作为第一种方法,您可以用字符串替换属性:
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.")]
````
【讨论】:
我尝试了第一个选项,现在可以了。我能够创建迁移。谢谢以上是关于添加迁移期间的“无主键”消息的主要内容,如果未能解决你的问题,请参考以下文章