Как создать несколько перегрузок методов CRUD?
Если у меня есть класс, который представляет сопоставление с конкретной таблицей в моей БД, каким-то образом. Этот класс содержит около 30 свойств.
Я создал CRUD Methods
.
И мне нужен другой (UPDATE
) метод, который должен обновлять только два поля.
Что я должен делать хорошо на простом примере?
-
Используя мой существующий метод, заполнив весь объект и обновив все поля, включая мои предполагаемые два поля? (Бесполезная работа)
-
Создайте статический метод с другим именем (но я хочу сохранить имя моего метода, потому что оно выразительное)! И принимает два параметра?
Ответы
Ответ 1
Я бы попытался создать два отдельных интерфейса и создать перегруженные функции для каждого интерфейса. Я бы группировал свойства на основе использования, например, я хочу, чтобы статус обновлялся некоторое время отдельно от других общих свойств.
public interface ICommonProperties
{
public string P1{get; set;}
public string P2{get; set;}
public string P3{ get; set; }
}
public interface ITrackable
{
public string Status{get; set;}
}
public class FinalClass : ICommonProperties, ITrackable
{
public string P1{get; set;}
public string P2{get; set;}
public string P3{get; set;}
public string Status{get; set;}
}
public class FinalClassOperations
{
public void Update(FinalClass finalClassInstance) { }; //Updates everything
public void Update(ICommonProperties finalClassInstance) { }; //Updates only ICommonProperties
public void Update(ITrackable finalClassInstance) { }; //updates only Status.
}
Кроме того, если вы хотите, вы можете создать отдельный класс для просто обновления статуса и который по-прежнему будет соответствовать:
public class Tracker : ITrackable{
public string Status{get; set;}
}
Но да, если два свойства не могут быть отделены логически, я бы не сделал этого и не объединим их.
Ответ 2
Я бы предложил следовать вашему второму варианту, но нет необходимости менять имя, поскольку количество параметров метода будет различным на обоих
Давайте рассмотрим несколько примеров
Я попытаюсь создать подобную ситуацию, надеюсь, это ваша ситуация. вы можете уточнить, не ошибался ли я на вопрос.
КЛАССЫ И МЕТОД
/// <summary>
/// CLass to store properties related to database
/// </summary>
class ObjectoA
{
public string A{get; set;}
public string B{get; set;}
public string C{ get; set; }
}
/// <summary>
/// class to call method to update.
///
/// </summary>
class ObjectB
{
/// <summary>
/// update method.
/// I would go with this solution.
/// optionlay you can call the method which receive parameter of object
/// </summary>
/// <param name="A"> Object with properties mapped to database</param>
/// <param name="updatetwoproperties">Optional paramneter to decide which update to run.
/// the default value should be for update that run most. For your need if you want to create an update methods for other
/// two sets of parameter a suggest you create an Enum and pass this enum as optional parameter instead of bool parameter or you
/// can pass as string and map each string value to specific update inside. IF YOU NEED EXAMPLE
/// REPLAY ON COMMENTS</param>
/// <returns></returns>
public bool update(ObjectoA A, bool updatetwoproperties=false)
{
//method implementation
if (updatetwoproperties)
{
//implement a update to all field
}
else
{
//implement update just to two field
}
return true;
}
/// <summary>
/// update method based on parameter to update
/// </summary>
/// <param name="a">this properties is mapped on database</param>
/// <param name="b">this propertie is mapped on database</param>
/// <returns></returns>
public bool update(string a, string b)
{
//method implementation e validate the return value
return true;
}
}
/// <summary>
/// I don't suggest to use this solution because
/// it will add a method on string type while this method isn't related to string
/// I just added here as a workaround for you.
/// </summary>
открытый статический класс ObjectC { public static bool update (эта строка a, строка b) { // реализация обновления и проверка возвращаемого значения return true; } }
ВЫЗОВ МЕТОДА И ОБЪЯСНЕНИЯ
static void Main(string[] args)
{
ObjectB B = new ObjectB(); //Class with methods
ObjectoA A = new ObjectoA(); //object with properties
#region Using Optional parameter to decide which update to run
//Calling a method to update all columns
B.update(A);
//Calling a method to update two columns
B.update(A, true);
#endregion
#region Using polymorphism to update
//Calling a method to update all columns
B.update(A);
//Update only using paramenter
B.update(A.B, A.C);
#endregion
//NOT RECOMMEND BECAUSE THIS UPDATE ISN'T RELATED TO STRING TYPE
#region Using extension method to update
//Calling a method to update all columns
B.update(A);
//using the extension method on variable type
A.B.update(A.C);
#endregion
//WE COULD USE EXTENSION METHOD ON YOUR OBJECT BUT IT WILL FAIL BECAUSE WE ALREADY AS UPDATE METHOD ON CLASS
//IF YOU WANT TO SEE HOW JUST REPLAY
}
Я ПРЕДЛАГАЮ ВАМ ДОПОЛНИТЕЛЬНЫЙ ПАРАМЕТР НА ВАШЕМ МЕТОДЕ, ЧТОБЫ ПОСТАНОВИТЬ, КОТОРЫЕ ОБНОВЛЯЮТ ИСПОЛЬЗОВАТЬ
Ответ 3
Это зависит от ваших приоритетов в проекте:
используя уже существующий метод обновления, все время будет обновлять все, указывая трафик, ввод-вывод и время процесса (валидация и т.д.).
Если вы находитесь в проекте, в котором свойства timestamped, они будут обновляться, даже если значение действительно не изменилось...
Если вы не возражаете обо всем этом, используйте метод update() все время.
Мой персональный POV: создайте новый метод (с явным именем). Это будет время от времени и время размышления через 2 года, когда вам придется изменить этот класс;)
Ответ 4
Я не знаю, нужно ли это делать обязательно, но здесь вы можете что-то сделать: Создайте SetAll или SetMany или любой другой метод, в котором вы передаете другой экземпляр вашего класса (источник). Проверьте каждое свойство и, если оно не пустое, вы устанавливаете значение свойства объекта назначения в значение свойства исходного объекта. Обратите внимание, что эта тактика будет зависеть от типов с нулевым значением и предполагает, что вы можете игнорировать пустые значения, переданные в новый метод setter. Вот иллюстрация:
using System;
namespace BlogPartialUpdateTrick
{
public class SomeClass
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int? HeightInches { get; set; }
public DateTime? Dob { get; set; }
public void SetAll(SomeClass source)
{
this.FirstName = source.FirstName ?? this.FirstName;
this.LastName = source.LastName ?? this.LastName;
this.HeightInches = source.HeightInches ?? this.HeightInches;
this.Dob = source.Dob ?? this.Dob;
}
public override string ToString()
{
return String.Format("fn: {0}, ln: {1}, height: {2}, DOB: {3}", FirstName ?? String.Empty, LastName ?? String.Empty,
HeightInches.HasValue ? HeightInches.Value.ToString() : "null", Dob.HasValue ? Dob.Value.ToShortDateString() : "null" );
}
}
}
В этом первом примере кода у нас есть мой spiffy класс SomeClass. Он получил 4 свойства, все из которых являются нулевыми. Примечательной частью этого класса является SetAllMethod, где я могу передать исходный объект, который также имеет тип SomeClass. Он присваивает этим значениям свойства экземпляра значения, переданные в исходном параметре, но только если они не равны нулю. Здесь 2-й код, где я использую этот материал:
using System;
using System.Windows.Forms;
namespace BlogPartialUpdateTrick
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var destination = new SomeClass() { FirstName = "Freddy", LastName = "Fingers", Dob = DateTime.Parse("01/01/1970"), HeightInches = 72 };
var source = new SomeClass() { FirstName = null, LastName="Flippers", Dob = null, HeightInches = 80 };
destination.SetAll(source);
MessageBox.Show(destination.ToString());
}
}
}
Создайте объект назначения, объект-источник, вызовите новый метод, вуаля! вывода:
"fn: Freddy, ln: Ласты, высота: 80, DOB: 1/1/1970"
Ответ 5
Вероятно, вы должны использовать Entity Framework и позволить контексту сделать это за вас. Используя EF, вы сможете обновлять такие объекты следующим образом:
try
{
var original = ObjectContext.Set<Request>().SingleOrDefault(x => x.Id.Equals(_request.Id));
if (original != null)
{
ObjectContext.Entry(original).CurrentValues.SetValues(_request);
}
return ObjectContext.SaveChanges();
}
catch (Exception ee)
{
return -1;
}