Как создать несколько перегрузок методов CRUD?

Если у меня есть класс, который представляет сопоставление с конкретной таблицей в моей БД, каким-то образом. Этот класс содержит около 30 свойств.

Я создал CRUD Methods.

И мне нужен другой (UPDATE) метод, который должен обновлять только два поля.

Что я должен делать хорошо на простом примере?

  1. Используя мой существующий метод, заполнив весь объект и обновив все поля, включая мои предполагаемые два поля? (Бесполезная работа)

  2. Создайте статический метод с другим именем (но я хочу сохранить имя моего метода, потому что оно выразительное)! И принимает два параметра?

Ответ 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;
        }