#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.Objects3. Почему базовый класс является универсальным? Вы не используете тип нигде в коде. Есть ли еще какой-нибудь код, который использует это, который здесь не включен? В этом случае это может быть тот код, который имеет значение…
Ответ №1:
Ваш универсальный класс не использует никаких параметров типа, поэтому вы можете сделать его не универсальным. И «Pkey» не является соглашением для EF для первичных ключей. Вы должны переименовать его в «Id» или вам нужно явно определить его как первичный ключ в ваших сопоставлениях, например :
modelBuilder.Entity<Role>().HasKey(t => t.PKey);
modelBuilder.Entity<User>().HasKey(t => t.PKey);
Комментарии:
1. Теперь я смотрю более внимательно, на самом деле это не проблема… Проблема в том, что ни одно из свойств для пользователя или роли не доступно моделям в моем приложении MVC. Я не уверен, как их раскрыть, поскольку я не хочу, чтобы эти классы были видны MVC
2. Я задам новый вопрос по этому поводу. Да, я использую строительные леса