Подклассы LINQ to SQL Data Entities - плохая идея или что-то упущено? - PullRequest
1 голос
/ 17 мая 2011

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

Например, если у меня есть таблица Client в моей базе данных, я могу создать ClientBO, который расширяет класс Client и добавляет поведение, подобное GenerateInvoice() или как угодно. Все работает нормально, пока я не хочу обновить значения в подклассе или вставить новую запись. Такие изменения (предсказуемо?) Отбрасываются. Я что-то упускаю или нарушаю принцип LINQ to SQL или OO, создавая эти подклассы в первую очередь?

Ниже приведены упрощенные примеры моего кода:

public class ClientBO : Client
{
    public ClientBO( Client source ) : base()
    {
        FirstName = source.FirstName;
        Lastname = source.LastName;
        // ... etc ...
    }
}

List<ClientBO> clientList = 
    ( from client in DatabaseContext.Clients select new ClientBO( client ) ).ToList();

clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();

Ответы [ 2 ]

4 голосов
/ 17 мая 2011

Проблема в том, что изменяемый объект больше не является тем же объектом, который был получен из хранилища данных.

DataContext отслеживает изменения всех объектов, которые он прикрепил.Но поскольку вы никогда не меняете «исходный» -объект в том виде, в каком вы его называете, контекст данных никогда не уведомляется об изменении

, я бы посоветовал вам сделать ваш ClientBO частичным классом Clientвместо этого (конечно, переименовывая это к Клиенту).Все классы Linq-To-Sql генерируются как частичные, и, таким образом, вы можете легко расширить их следующим образом

Например:

public partial class Client
{
    public void GenerateInvoice()
    {
        // ... etc ...
    }
}

List<Client> clientList = MyDatabaseContext.Clients.ToList();

clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();
1 голос
/ 17 мая 2011

Я думаю, что вы действительно хотите здесь несколько методов расширения:

http://msdn.microsoft.com/en-us/library/bb383977.aspx

Они будут выглядеть, как будто они являются частью класса, но вы реализуете их в другом модуле.Именно то, что вы хотите.

...