Есть ли способ переопределить пустой конструктор в классе, сгенерированном LinqToSql?
-
01-07-2019 - |
Вопрос
Если у меня есть таблица в моей базе данных с именем "Users", там будет класс, сгенерированный LinqToSql с именем "User" с уже объявленным пустым конструктором.
Какова наилучшая практика, если я хочу переопределить этот конструктор и добавить к нему свою собственную логику?
Решение
Конструктор по умолчанию, который генерируется O / R-Designer, вызывает частичную функцию, вызываемую OnCreated
- таким образом, наилучшая практика - не переопределять конструктор по умолчанию, а вместо этого реализовать частичную функцию OnCreated
в MyDataClasses.cs
для инициализации элементов:
partial void OnCreated()
{
Name = "";
}
Если вы реализуете другие конструкторы, всегда старайтесь вызывать конструктор по умолчанию, чтобы классы были инициализированы должным образом - например, entitysets (отношения) создаются в конструкторе по умолчанию.
Другие советы
Не похоже, что вы можете переопределить пустой конструктор.Вместо этого я бы создал метод, который выполняет необходимую вам функциональность в пустом конструкторе и возвращает новый объект.
// Add new partial class to extend functionality
public partial class User {
// Add additional constructor
public User(int id) {
ID = id;
}
// Add static method to initialize new object
public User GetNewUser() {
// functionality
User user = new User();
user.Name = "NewName";
return user;
}
}
Затем в другом месте вашего кода, вместо использования пустого конструктора по умолчанию, выполните одно из следующих действий:
User user1 = new User(1);
User user2 = User.GetNewUser();
Установка свойства DataContext Connection в значение "None" сработала для меня.Шаги ниже.
Откройте dbml -> Щелкните правой кнопкой мыши Свойства -> Обновить соединение в свойствах DataContext на "Нет".Это приведет к удалению пустого конструктора из сгенерированного файла кода.-> Создайте новый частичный класс для DataContext с пустым конструктором, как показано ниже
Partial Class MyDataContext
Public Sub New()
MyBase.New(ConfigurationManager.ConnectionStrings("MyConnectionString").ConnectionString, mappingSource)
OnCreated()
End Sub
End Class
Вот версия C #:
public partial class PENCILS_LinqToSql_DataClassesDataContext
{
public PENCILS_LinqToSql_DataClassesDataContext() : base(ConnectionString(), mappingSource)
{
}
public static String ConnectionString()
{
String CS;
String Key;
Key = System.Configuration.ConfigurationManager.AppSettings["DefaultConnectionString"].ToString();
/// Get the actual connection string.
CS = System.Configuration.ConfigurationManager.ConnectionStrings[Key].ToString();
return CS;
}
}