ADO EF数据处理方法

时间:2011-10-19 16:50:16

标签: c# .net entity-framework generics

我希望有人能指出我重构一些接受泛型类型的方法。

我有一个与我的数据库中的许多不同表格对话的服务。大多数表格格式相同。该服务对所有表执行相同的基本操作,GetAll,Save,Delete。由于操作是一样的,我一直在寻找一种创建核心动作库的方法。

这是我的保存功能的一个例子,这与其他表的唯一区别是数据。所以这里是ClientData,下一个是GroupData等......

internal static void SaveClient(ClientData clientData)
        {
            using (CFOEntityModelContainer database = new CFOEntityModelContainer())
            {
                if (!IsClientValid(clientData.Id))
                {
                    database.Clients.AddObject(ConvertClientDataToClient(clientData));
                    database.SaveChanges();
                }
                else
                {
                    Client client = database.Clients.First(
                        c => c.Id == clientData.Id);

                    client.Name = clientData.Name;

                    database.SaveChanges();
                }
            }
        }

建议?

1 个答案:

答案 0 :(得分:2)

如果您的方法包含特定于类型的操作,您期望如何使其成为通用的?您是否始终拥有XXX实体和XXXData类,其中XXX实体包含IdName以及XXXData类包含NameId?如果不是你的通用保存只是模板接受委托给特定方法=没有简化。如果是,您可以执行以下操作:

首先准备泛型方法中使用的接口:

public interface IData
{
    int Id { get; }
    string Name { get; set; }
}

现在在您的实体和数据类上实现该接口并创建泛型方法:

internal static void Save<TEntity, TData>(TData data)
    where TEntity : class, IData
    where TData : class, IData
{
    using (CFOEntityModelContainer database = new CFOEntityModelContainer())
    {
        ObjectSet<TEntity> set = database.CreateObjectSet<TEntity>();

        // Here you have specific method - can you make it generic?
        // If not it must be another parameter (delegate) passed to Save method
        if (!IsValid(data.Id))  
        {
            // Convert is another specific method which must be generalize
            // This time it can be probably solved by overriding conversion
            // operator on each data implementation
            set.AddObject(Convert(data));
        }
        else
        {
            // Another specific logic - can you make it generic?
            // If not it must be passed as delegate
            TEntity entity = set.First(e => e.Id == data.Id);
            entity.Name = data.Name;
        }

        database.SaveChanges();
    }
}

您可以将此方法称为:

Save<Client, ClientData>(data);