2009-09-04 69 views
0

我想写一个通用的存储库,将执行所有我的linq2sql类的基本方法。 (getById,insert,delete,getAll)linqtosql类的通用存储库帮助

我不太确定如何完成这件事。 继承人到目前为止... getById方法给我一个错误,因为它不能将Id属性与'T'类关联起来。我将不胜感激就如何满脑子都在这个通用类的概念

public class Repository<T> where T:class 
{ 
    private ClassesDataContext db = new ClassesDataContext(); 


public IQueryable<T> getAll() 
{ 
    return db.GetTable<T>(); 
} 
public T getById(int id) 
{ 
    db.GetTable<T>().Where(e=>e.Id==id); 
    return db.GetTable<T>().Single(c =>c.Id==id); 
}} 

回答

0

里面你的仓库类它将把类型T的实例作为对象的一些指针(不具有ID属性)。

有一些通用的支持,你可以创建一个基本的实体类是这样的:

public abstract class EntityBase 
{ 
    public int Id {get; private set; } 
} 

并作出存储库将继承使用从这个类的所有实体。

然后,您就需要更新你的资料库类定义包含这个地方,而不是一个你有:

public class Repository<T> where T: EntityBase 

这将使你的资料库方法里面类型T的所有实例都被视为EntityBase - 它定义了Id方法。

+0

嘿,这看起来可能是工作......但我不知道如何实例库在我的控制器 存储库 companyrepository = new存储库(); 给我错误 – ignaciofuentes 2009-09-04 18:11:35

+0

您的公司类是否继承了EntityBase类? – 2009-09-04 18:52:52

+0

不,公司类是自动创建的linqtosql类与设计师...如果它必须继承,那么我想我不得不寻找另一种方法 – ignaciofuentes 2009-09-04 19:08:07

0

不能使用兰巴表达式(凡在getById法条款)来检索监守性能项目不知道T类型

你必须建立一个SQL字符串并执行。

string query = "SELECT * FROM [SomeTable] WHERE [SomeColumn] = {0}"; 
return db.ExecuteQuery<T>(query, id).FirstOrDefault(); 

您将获得的表名和PrimaryKeyName类型T.您可以使用以下获得表名:

db.Mapping.GetTable(typeof(T)).TableName; 

可以使用获得主键列的列表:

db..Mapping.GetTable(typeof(T)).RowType.IdentityMembers.Select(m => m.MappedName).ToArray(); 

如果您不介意让每个存储库都从基类中入手,您可以简单地为TableName和PrimaryKey设置两个字段。

为Linq2Sql构建完整的通用DAL/Repository有很多工作要做。它真的很有趣,为分离的实体创建通用的Save,Update方法。

-Douglas H.

+0

哎呀,我的错误。我没有意识到你正在为你的数据库创建一个特定的DataContext。我以为你正在创建一个通用的DataContext类。那么Jirapong是正确的。 – Douglas 2009-09-04 18:53:41