webentwicklung-frage-antwort-db.com.de

Entity Framework Core fügt einen eindeutigen Constraint-Code ein

Ich kann keinen Weg finden, meinem Feldattribut eine eindeutige Einschränkung hinzuzufügen

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; }
}

Ich benutze 

 "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",
66
Vadim M

Im EF-Core können Sie keine Indizes mit Datenanmerkungen erstellen. Sie können dies jedoch mit der Fluent-API tun. 

So in Ihrem {Db}Context.cs:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>()
        .HasIndex(u => u.Email)
        .IsUnique();
}

... oder wenn Sie die Überladung mit buildAction verwenden:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<User>(entity => {
        entity.HasIndex(e => e.Email).IsUnique();
    });
}

Sie können mehr darüber lesen: Indizes

147
Sampath

Wenn Sie eindeutige Einschränkungen für mehrere Spalten erstellen möchten, können Sie dies einfach tun (im Anschluss an @ Sampaths link ).

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; }
}
39

Lösung für 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})
    }
}

Die DB-Tabelle sieht folgendermaßen aus:

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)
);

Verweise auf EF-Kerndokumente

Keine dieser Methoden funktionierte für mich in .NET Core 2.2, aber ich konnte den Code anpassen, den ich zum Definieren eines anderen Primärschlüssels hatte, um für diesen Zweck zu arbeiten.

In der folgenden Instanz möchte ich sicherstellen, dass das Feld OutletRef eindeutig ist:

public class ApplicationDbContext : IdentityDbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Outlet>()
                .HasIndex(o => new { o.OutletRef });
        }
    }

Dies fügt den erforderlichen eindeutigen Index in die Datenbank ein. Was es jedoch nicht tut, ist die Möglichkeit, eine benutzerdefinierte Fehlermeldung anzugeben.

1
Robin Wilson

Das OP fragt, ob es möglich ist, einer Entitätsklasse für einen eindeutigen Schlüssel ein Attribut hinzuzufügen. Die kurze Antwort ist, dass es IS möglich ist, aber nicht eine sofort verfügbare Funktion des EF Core Team. Wenn Sie ein Attribut verwenden möchten, um eindeutige Schlüssel zu Ihren Entity Framework Core-Entitätsklassen hinzuzufügen, können Sie tun, was ich gepostet habe hier

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; }
}
0
Justin Tubbs

Wir können einen eindeutigen Schlüsselindex hinzufügen, indem wir eine flüssige API verwenden. Der folgende Code hat für mich funktioniert

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<User>().Property(p => p.Email).HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_EmailIndex") { IsUnique = true }));

    }
0
Kuldeep Singh

Für jemanden, der alle diese Lösungen versucht, aber nicht funktioniert, hat es für mich funktioniert

 protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<User>()
         .Property(t => t.Email)
        .HasColumnAnnotation(
    "Index",
    new IndexAnnotation(new IndexAttribute { IsUnique = true }));
    }
0
Shonie