Как сделать атрибуты класса Inheritate из таблицы DAL и вставить - PullRequest
1 голос
/ 03 июня 2011

Я пытаюсь заставить этот бизнес-класс наследовать атрибуты от DAL Типа (клиента).

Клиент - это таблица.

Это класс BUS, получающий атрибуты из таблицы Клиент

    public class BusClient : Client
    {
        public void Insert()
        {
            using(MyBIEntities db = new MyBIEntities())
            {
                db.AddToClients(this); //Here's the problem (don't know what to pass)
                db.SaveChanges();
            }
        }

        public bool Validate()
        {
            //Validation Rules goes here.
            return true;
        }
    }

это вызовы веб-формы:

    try
    {
        BusClient client = new BusClient();

        //Filling properties from Client (table) in the BusClient object all OK.
        client.CityId = int.Parse(ddlCity.SelectedValue());
        client.Name = txtName.Text;
        client.RegisterDate = Convert.ToDateTime("txtDate.Text");

        if (client.Validate())
        {
            client.Insert();
        }
    }
    catch (Exception ex)
    {
        //Catching errors
    }

Проблема, очевидно, в том, что я могуне передать тип BusClient для вставки ... Но у меня есть все эти свойства, которые уже заполнены, как лучше использовать их для методов Validate() и Insert()?

Другое дело: как лучше избегать исключений / ошибок типа (на стороне сервера), возникающих в форме ПРЕЖДЕ ЧЕМ я пытаюсь проверить ()?

1 Ответ

0 голосов
/ 04 июня 2011

Как вы уже видели, вы не можете перейти в BusClient в AddToClients. Вам придется создать Client из BusClient в вашем Insert методе, скопировав свойства, что довольно уродливо:

public void Insert()
{
    using(MyBIEntities db = new MyBIEntities())
    {
        Client client = new Client();

        client.CityId = this.CityId;
        client.Name = this.Name;
        client.RegisterDate = this.RegisterDate;

        db.AddToClients(client);
        db.SaveChanges();
    }
}

Переосмыслите дизайн. Я не вижу выгоды от получения класса (BusClient) от сущности (Client). Если вы не можете изменить класс Client, вы можете создать любой метод расширения ...

public static class Extensions
{
    public static bool Validate(this Client client)
    {
        // Run validation rules on client object
    }
}

... или отдельный класс для вашей проверки:

public class Validator
{
    public bool Validate(Client client)
    {
        // Run validation rules on client object
    }
}

Я бы тоже дважды подумал об этом отдельном Insert методе. Хотя это может работать в вашем примере, это может вызвать проблемы (или, по крайней мере, стать бесполезными), как только вам придется манипулировать более сложным графом объектов. В таком случае вам понадобится один единственный ObjectContext для всей операции. Вы больше не можете работать с отдельным ObjectContext для каждого INSERT, UPDATE или DELETE и т. Д.

Итак, я бы порекомендовал удалить операции с БД из вашего специального класса и поместить это в основную процедуру. Все это может выглядеть так:

try
{
    using(MyBIEntities db = new MyBIEntities())
    {
        Client client = new Client();

        client.CityId = int.Parse(ddlCity.SelectedValue());
        client.Name = txtName.Text;
        client.RegisterDate = Convert.ToDateTime("txtDate.Text");

        if (client.Validate())
        // works with the extension method, or with the Validator use:
        // Validator validator = new Validator();
        // if (validator.Validate(client))
        {
            db.AddToClients(client);
            db.SaveChanges();
        }
    }
}
catch (Exception ex)
{
    //Catching errors
}

В этом примере класс BusClient больше не существует.

...