Свойство, созданное с помощью общего наследования, не существует

#c# #generics #abstract-class #code-first

#c# #общие #абстрактный класс #сначала код

Вопрос:

В моем проекте я храню несколько библиотек классов для реализации общих функций. У одного из них есть класс LoganBaseObject

Этот класс добавляет общие столбцы в таблицы, которые я разрабатываю с помощью code-first (столбец первичного ключа, когда и кем были созданы / отредактированы данные и т. Д.).

Я реализую этот класс через наследование для классов, представляющих таблицы в моей базе данных, однако я очень смущен, поскольку он отлично работает на одном из этих классов, но совсем не на другом (или так кажется). Смотрите ниже:

Вот LoganBaseObject

 namespace Logan.Base
{
    public abstract class LoganBaseObject<T>
        where T : LoganBaseObject<T>
    {
        [Key]
        public Int64 PKey { get; set; }

        public LoganBaseObject()
        {
            PKey = 0;
        }
    }
}
  

Ниже приведены классы, в которых я это реализовал. Реализация для роли работает нормально, но класс User не получает свойство PKey…

 namespace Logan.Web.Objects
{
    public class Role : LoganBaseObject<Role>
    {
        public string RoleName { get; set; }

        public virtual ICollection<User> Users { get; set; }

        public Role()
        {
            RoleName = String.Empty;
            Users = new List<User>();
        }
    }

    public class User : LoganBaseObject<User>
    {
        public string Username { get; set; }
        public string EmailAddress { get; set; }
        public string Password { get; set; }
        public string Biography { get; set; }
        public virtual Role Role { get; set; }

        public virtual ICollection<Article> Articles { get; set; }

        public User()
        {
            Username = String.Empty;
            EmailAddress = String.Empty;
            Password = String.Empty;
            Biography = String.Empty;
            Articles = new List<Article>();
        }
    }
}
  

Я не вижу никакой разницы ни в одном классе внутри Logan.Web.Objects, поэтому я не могу понять, почему свойство PKey существует для ролей, но не для пользователей.

Я был бы очень признателен, если бы кто-нибудь мог заглянуть сюда и помочь мне решить эту проблему. Я не могу продвигаться вперед в разработке системы, если это не будет решено.

Заранее спасибо!

Комментарии:

1. Почему бы вам не попытаться быстро определить свои сопоставления PK?

2. Друг помог мне настроить это, и когда я не наследую класс LoganBaseObject, тогда лямбда-выражения прерываются в классах DbContext (где я настраивал Property(p => p.Username).IsRequired(); и тому подобное. Поэтому я не уверен, как обойти это, иначе я бы просто определил столбцы RoleId и userId в классах Logan.Web.Objects

3. Почему базовый класс является универсальным? Вы не используете тип нигде в коде. Есть ли еще какой-нибудь код, который использует это, который здесь не включен? В этом случае это может быть тот код, который имеет значение…

Ответ №1:

Ваш универсальный класс не использует никаких параметров типа, поэтому вы можете сделать его не универсальным. И «Pkey» не является соглашением для EF для первичных ключей. Вы должны переименовать его в «Id» или вам нужно явно определить его как первичный ключ в ваших сопоставлениях, например :

 modelBuilder.Entity<Role>().HasKey(t => t.PKey);
modelBuilder.Entity<User>().HasKey(t => t.PKey);
  

Комментарии:

1. Теперь я смотрю более внимательно, на самом деле это не проблема… Проблема в том, что ни одно из свойств для пользователя или роли не доступно моделям в моем приложении MVC. Я не уверен, как их раскрыть, поскольку я не хочу, чтобы эти классы были видны MVC

2. Я задам новый вопрос по этому поводу. Да, я использую строительные леса