Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ To SQL创建通用数据访问对象(DAO)CRUD方法_C#_Linq_Linq To Sql_Crud_Dao - Fatal编程技术网

C# 如何使用LINQ To SQL创建通用数据访问对象(DAO)CRUD方法

C# 如何使用LINQ To SQL创建通用数据访问对象(DAO)CRUD方法,c#,linq,linq-to-sql,crud,dao,C#,Linq,Linq To Sql,Crud,Dao,我不熟悉linqtosql,并尝试为基本的create、Read、Update和Destroy(CRUD)方法创建一个通用数据访问对象(DAO),以便重用代码。我使用下面的代码成功地创建了一个通用方法,该方法将删除任何实体,但我想知道是否有人知道如何创建一个通用方法,该方法将通过所有表上存在的公共Id字段选择任何实体 /// <summary> /// Generic method that deletes an entity of any type using LI

我不熟悉linqtosql,并尝试为基本的create、Read、Update和Destroy(CRUD)方法创建一个通用数据访问对象(DAO),以便重用代码。我使用下面的代码成功地创建了一个通用方法,该方法将删除任何实体,但我想知道是否有人知道如何创建一个通用方法,该方法将通过所有表上存在的公共Id字段选择任何实体

    /// <summary>
    /// Generic method that deletes an entity of any type using LINQ
    /// </summary>
    /// <param name="entity"></param>
    /// <returns>bool indicating whether or not operation was successful</returns>
    public bool deleteEntity(Object entity)
    {
        try
        {
            DomainClassesDataContext db = new DomainClassesDataContext();
            db.GetTable(entity.GetType()).Attach(entity);
            db.GetTable(entity.GetType()).DeleteOnSubmit(entity);
            db.SubmitChanges();
            return true;
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.StackTrace);
            return false;
        }
    }
//
///使用LINQ删除任何类型实体的通用方法
/// 
/// 
///bool指示操作是否成功
公共布尔删除实体(对象实体)
{
尝试
{
DomainClassesDataContext db=新的DomainClassesDataContext();
db.GetTable(entity.GetType()).Attach(entity);
db.GetTable(entity.GetType()).DeleteOnSubmit(entity);
db.SubmitChanges();
返回true;
}
捕获(例外情况除外)
{
控制台写入线(例如StackTrace);
返回false;
}
}

我很确定相同的模式也适用于更新和插入,我希望在GenericDAO上有一个通用方法,可以根据实体Id检索任何实体(即客户、发票、工作订单等)。提前感谢您的回复。

我想您正在寻找,以下是它的一个简单实现:

首先,您需要创建一个界面
IRepository
,如下所示:

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
    IEnumerable<T> All();
    ...
}
其中,
Customer
是映射到数据库的实体,该数据库在
.dbml
中定义。这只是一个开始,有关更多详细信息,请参阅以下内容:


非常感谢。这很好用。我过去只在Java中使用过Hibernate,框架已经就位。现在,我是唯一一个从头开始开发项目的开发人员,所以这是我第一次不得不在团队之外编写自己的数据访问层。我希望我有足够的代表投票支持这个解决方案。我是这个社区的新成员,当我的代表级别更高时,我一定会投票支持这个问题。@AaronMajor Glade帮助并欢迎来到stackoverflow,顺便说一句:如果你觉得答案有用,可以将其标记为已接受。见此:@MahmoudGamal很棒的答案。是否必须使用接口?我们是否可以定义单个类(存储库)并从控制器的操作方法添加或更新或删除记录。Thanks@User-不,它不是强制性的,但接口作为通用存储库工作,它具有接口的优点,而不是直接使用类,例如如果特定存储库需要其他操作,则可以扩展通用存储库接口。一般来说,这取决于您的设计和要求,还可以阅读更多关于类和接口的信息,以及您应该何时选择其他类和接口。@MahmoudGamal感谢您的回答,非常感谢您的帮助。我还有一个疑问,因为这个链接实体框架已经实现了一个存储库模式,如果是这种情况,我不能使用我自己的存储库,以便减少编码。需要您善意的建议,感谢您的时间和耐心。
public class Repository<T> : IRepository<T>
    where T : class, IEntity
{
    DataContext _db;
    public Repository()
    {
        _db = new DataContext("Database string connection");
        _db.DeferredLoadingEnabled = false;
    }
    public void Add(T entity)
    {
        if (!Exists(entity))
            GetTable.InsertOnSubmit(entity);
        else
            Update(entity);
        SaveAll();
    }
    public void Delete(T entity)
    {
        GetTable.DeleteOnSubmit(entity);
        SaveAll();
    }
    public void Update(T entity)
    {
        GetTable.Attach(entity, true);
        SaveAll();
    }
    System.Data.Linq.Table<T> GetTable
    {
        get { return _db.GetTable<T>(); }
    }
    public IEnumerable<T> All()
    {
        return GetTable;
    }
}
public class CustomerRepository : Repository<Customer>
{
    public ProductRepository()
        : base()
    {
    }
}
Customer newCustomer = new Customer { FistName = "Foo", LastName = "Boo" };
_customerRepository.Add(newCustomer);