Vad*_*m M 112 c# entity-framework entity-framework-core
我找不到为我的field属性添加唯一约束的方法
public class User
{
[Required]
public int Id { get; set; }
[Required]
// [Index("IX_FirstAndSecond", 2, IsUnique = true)] not supported by core
public string Email { get; set; }
[Required]
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在用
"Microsoft.EntityFrameworkCore": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
Run Code Online (Sandbox Code Playgroud)
Sam*_*ath 222
在EF核心上,您无法使用数据注释创建索引.但您可以使用Fluent API执行此操作.
在你的内心像这样{Db}Context.cs
:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
}
Run Code Online (Sandbox Code Playgroud)
...或者如果你在buildAction中使用了重载:
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<User>(entity => {
entity.HasIndex(e => e.Email).IsUnique();
});
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里阅读更多相关信息:索引
Hos*_*Rad 53
此外,如果您想在多个列上创建唯一约束,您可以简单地执行此操作(遵循@ Sampath的链接)
class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasIndex(p => new { p.FirstName, p.LastName })
.IsUnique(true);
}
}
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
小智 14
从 Entity Framework Core (EF Core) 5.0 开始,我们可以通过 Data Annotations 配置唯一索引。
它与例如 EF6 几乎没有什么不同,因为我们不能在属性本身上设置它,而是在类上设置它。
[Index(nameof(EmailAddress), IsUnique = true)]
public class User
{
[Key]
public Guid Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
public string EmailAddress { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有关索引和数据注释的更多信息,请参阅:https : //docs.microsoft.com/en-us/ef/core/modeling/indexes?tabs= data-annotations
OP 询问是否可以将属性添加到实体类中作为唯一键。简而言之,这是可能的,但不是 EF Core 团队开箱即用的功能。如果您想使用属性将唯一键添加到 Entity Framework Core 实体类,您可以执行我在此处发布的操作
public class Company
{
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid CompanyId { get; set; }
[Required]
[UniqueKey(groupId: "1", order: 0)]
[StringLength(100, MinimumLength = 1)]
public string CompanyName { get; set; }
[Required]
[UniqueKey(groupId: "1", order: 1)]
[StringLength(100, MinimumLength = 1)]
public string CompanyLocation { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
通过模型配置在 EF 核心中使用它
public class ApplicationCompanyConfiguration : IEntityTypeConfiguration<Company>
{
public void Configure(EntityTypeBuilder<Company> builder)
{
builder.ToTable("Company");
builder.HasIndex(p => p.Name).IsUnique();
}
}
Run Code Online (Sandbox Code Playgroud)
EF Core的解决方案
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Passport { get; set; }
}
public class ApplicationContext : DbContext
{
public DbSet<User> Users { get; set; }
public ApplicationContext()
{
Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=efbasicsappdb;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasAlternateKey(u => u.Passport);
//or: modelBuilder.Entity<User>().HasAlternateKey(u => new { u.Passport, u.Name})
}
}
Run Code Online (Sandbox Code Playgroud)
DB表将如下所示:
CREATE TABLE [dbo].[Users] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
[Passport] NVARCHAR (450) NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [AK_Users_Passport] UNIQUE NONCLUSTERED ([Passport] ASC)
);
Run Code Online (Sandbox Code Playgroud)
Ef 核心支持独特的配置。
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<Account>()
.HasIndex(account => account.Email)
.IsUnique();
}
Run Code Online (Sandbox Code Playgroud)
ef core 支持多个唯一键
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Account>()
.HasKey(account => new { account.Id, account.Email, account.RoleId });
}
Run Code Online (Sandbox Code Playgroud)
不要忘记运行 ef core 命令来进行迁移和更新数据库
>> dotnet ef migrations add MigrationName -c YourDbContextName
>> dotnet ef database update -c YourDbContextName
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
74223 次 |
最近记录: |