2015-09-24 2 views
1

Есть ли способ частично вставить объект с помощью PetaPoco или NPoco? Например, у меня есть таблица пользователей:PetaPoco NPoco - Partial Insert

UserId | UserName | UserMail | UserCreationDate 

Каждая из этих столбцов являются NON NULLABLE и имеет значение по умолчанию, когда они пусты.

В ASP.NET У меня есть класс User, и я использую ОРМ, чтобы вставить новую запись только с именем:

Dim userData As New User() 
userData.UserName = "Jimmy Hendrix" 
db.Insert(userData) 

Я ожидаю, что базы данных выглядит следующим образом:

UserId | UserName | UserMail | UserCreationDate 
    12 | Jimmy Hendrix | (DB default)| (DB default) 

Я хочу, чтобы команда insert только вставляла имя, не вставляя другие свойства объекта со значениями по умолчанию объекта.

Как частичное обновление, я хочу частичную вставку. Возможно ли это в PetaPoco?

Есть ли другой способ сделать это самостоятельно без ORM?

Edit:

Использование SQL я могу получить работу, но мне нужно использовать объекты POCO, так что я не хочу, чтобы запомнить параметры базы данных. Я хочу что-то вроде

user.UserName = "Michael" 
user.Insert(user) 

И он будет вставлять только имя пользователя, игнорируя другие переменные. SQL, что я хочу быть сгенерированы в фоновом режиме:

"INSERT Users(UserName) VALUES(@UserName)" 
(while the @UserName parameter holds the userData.FirstName value) 

Как вы можете видеть, он не принимает во внимание другие переменные в классе. Сегодня, если я использую команду insert, даже если я даю значение одному свойству в классе, NPoco по-прежнему пытается вставить ВСЕ переменные класса в настройку db, переменные, которые я не хотел устанавливать с помощью значений по умолчанию класса (которые отличаются от значений по умолчанию db)

Кроме того, все свойства могут быть вставлены/обновлены, поэтому в классе не может быть типов ResultColumn. Я хочу вставить эти значения, но только те, которые я объявляю в этом конкретном экземпляре. Все свойства доступны для обновления и вставки, но для каждого экземпляра я вставляю только то, что объявляю.

ответ

1

Я хотел бы создать класс PartialUserForInsert:

[TableName("Users")] 
public class PartialUserForInsert 
{ 
    public string UserName { get; set; } 
} 
+0

Это заставит меня создать класс для каждого обновления вставки, которое я делаю в системе. Это вызовет в тысячах подобных классов. Я не знаю, в каких полях я буду вставлять каждый вызов, и я бы не хотел, чтобы меня заставляли создавать несколько классов вроде этого. –

+0

Я думаю, что это ваш единственный вариант, кроме ответа @ CallMeKags ниже. Я знаю, что число db-слоев сначала увлажнит объект модели с помощью оператора select, чтобы убедиться, что состояние модели текущее до выполнения обновления. Может быть, вы могли бы использовать этот подход? – CharlieK

+1

Btw, ваше приложение звучит очень сложно, если у вас есть тысячи частичных шаблонов вставки/обновления. Есть ли в вашей системе 1000+ таблиц? – CharlieK

1

Введенная вами схема не включает столбец FirstName.

Предполагая, что столбец сопоставляется с UserName, использование следующего следует вставить, как ожидалось.

dim sql = new Sql("INSERT Users(UserName) VALUES(@0)", userData.FirstName) 
db.Execute(sql) 
+0

Использование SQL я могу получить работу, но мне нужно использовать объекты POCO, так что я не хочу, чтобы запомнить параметры базы данных , Я хочу что-то вроде: user.username = "Michael" user.Insert (пользователь) И это будет вставить только UserName, игнорируя другие переменные. sql, который вы опубликовали, - это то, что я хочу сделать на заднем плане PetaPoco. –

+0

Отметьте свойства, которые имеют значения по умолчанию с атрибутом ResultColumn. Это предотвратит любые обновления этих свойств. Тем не менее, вы должны явно включать эти столбцы при извлечении данных. – kagundajm

+0

Но я не хочу устанавливать их как ResultColumn, потому что все свойства вставляются/обновляются. Я хочу обновить эти значения, но только те, которые я объявляю в этом конкретном экземпляре. Все свойства доступны для обновления и вставки, но для каждого экземпляра я вставляю только то, что объявляю –

Смежные вопросы