web-dev-qa-db-fra.com

Le type d'entité 'Access' nécessite une clé primaire à définir. Si vous aviez l'intention d'utiliser un type d'entité sans clé, appelez 'Hasnokey ()'

j'ai ceci ValueObject:

public class Access : ValueObject<Access>
{
    public string ControllName { get;  set; }
    public string ActionName { get;  set; }

    private Access()
    {

    }
    public Access(string controllerName, string actionName)
    {
        ControllName = controllerName;
        ActionName = actionName;
    }

    protected override IEnumerable<object> GetEqualityComponents()
    {
        yield return ControllName;
        yield return ActionName;
    }
}

et c'est mon ValueObject<Access>:

 public abstract class ValueObject<T>
    where T : ValueObject<T>
{
    protected abstract IEnumerable<object> GetEqualityComponents();

    public override bool Equals(object obj)
    {
        var valueObject = obj as T;

        if (ReferenceEquals(valueObject, null))
            return false;

        return IsEquals(valueObject);
    }

    private bool IsEquals(ValueObject<T> other)
    {
        return GetEqualityComponents().SequenceEqual(other.GetEqualityComponents());
    }

    public override int GetHashCode()
    {
        return GetEqualityComponents()
            .Aggregate(1, (current, obj) => current * 23 + (obj?.GetHashCode() ?? 0));
    }

    public static bool operator ==(ValueObject<T> a, ValueObject<T> b)
    {
        if (ReferenceEquals(a, null) && ReferenceEquals(b, null))
            return true;

        if (ReferenceEquals(a, null) || ReferenceEquals(b, null))
            return false;

        return a.Equals(b);
    }

    public static bool operator !=(ValueObject<T> a, ValueObject<T> b)
    {
        return !(a == b);
    }
}

et c'est mon dbcontext:

 public class StoreAdminPanelGetwayContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer(@"Server=.; initial catalog=StoreAdminPanelGetway;integrated security=true");

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(typeof(Role).Assembly);
    }
    public DbSet<Role> Roles { get; set; }
    public DbSet<AccessLevel> AccessLevels { get; set; }

}

c'est mon entité:

  public class AccessLevel : Entity
{
    public int RoleId { get;  set; }
    public Access Access { get;  set; }
    public Role Role { get; set; }
}

mais quand j'ai besoin de add-migration initial DANQUREE Il me montre cette erreur:

Le type d'entité 'Access' nécessite une clé primaire à définir. Si vous aviez l'intention d'utiliser un type d'entité sans clé, appelez "Hasnokey ()".

mais Access est un objet de valeur et il ne peut pas avoir d'identité. Comment puis-je résoudre ce problème ???

3
kia kia

EF Core a le concept de Types d'entité possédés , qui peut être utilisé pour implémenter des types de valeur DDD.

Dans OnModelCreating vous feriez ce qui suit:

modelBuilder.Entity<AccessLevel>().OwnsOne(x => x.Access);

Cela stockerait les objets Access dans la même table de base de données que les objets AccessLevel, et ne nécessite donc aucune clé primaire.

3