C#Linq-SQL:存储库模式的UpdateByID方法

C#Linq-SQL:存储库模式的UpdateByID方法,第1张

概述我已经实现了一种Repository类,它有GetByID,DeleteByID方法等等,但是我在实现UpdateByID方法时遇到了麻烦. 我做了这样的事情: public virtual void UpdateByID(int id, T entity){ var dbcontext = DB; var item = GetByID(dbcontext, id 我已经实现了一种Repository类,它有GetByID,DeleteByID方法等等,但是我在实现UpdateByID方法时遇到了麻烦.

我做了这样的事情:

public virtual voID UpdateByID(int ID,T entity){        var dbcontext = DB;        var item = GetByID(dbcontext,ID);        item = entity;         dbcontext.submitChanges();}protected MusicRepo_DBDataContext DB{    get    {        return new MusicRepo_DBDataContext();    }}

但它没有更新传递的实体.

有没有人实现过这样的方法?

作为参考,here是GetByID方法

[更新]

正如marc正确建议的那样,我只是在改变局部变量的值.那你觉得我应该怎么做这个方法呢?使用反射并将属性从实体复制到项目?

解决方法 您更新的只是一个局部变量;为了实现这一点,你必须将成员值从一个实体复制到一个项目 – 不是那么简单.

像下面的东西;我使用TKey的唯一原因是我在northwind.Customer上测试,它有一个字符串键;-p

使用元模型的优点是,即使您使用POCO类(以及基于xml的映射),它也可以工作,并且它不会尝试更新与模型无关的任何内容.

出于示例的目的,我已经传入了数据上下文,您需要在某个时刻添加submitChanges,但其余部分应该可以直接比较.

顺便说一句 – 如果您乐意从传入的对象中获取ID,那也很容易 – 然后您可以支持复合身份表.

static voID Update<TEntity>(DataContext dataContext,int ID,TEntity obj)        where TEntity : class    {        Update<TEntity,int>(dataContext,ID,obj);    }    static voID Update<TEntity,TKey>(DataContext dataContext,TKey ID,TEntity obj)        where TEntity : class    {        // get the row from the database using the Meta-model        MetaType Meta = dataContext.MapPing.Gettable(typeof(TEntity)).RowType;        if(Meta.IDentityMembers.Count != 1) throw new InvalIDOperationException("Composite IDentity not supported");        string IDname = Meta.IDentityMembers[0].Member.name;        var param = Expression.Parameter(typeof(TEntity),"row");        var lambda = Expression.Lambda<Func<TEntity,bool>>(            Expression.Equal(                Expression.PropertyOrFIEld(param,IDname),Expression.Constant(ID,typeof(TKey))),param);        object dbrow = dataContext.Gettable<TEntity>().Single(lambda);        foreach (MetaDataMember member in Meta.DataMembers)        {            // don't copy ID            if (member.IsPrimaryKey) continue; // removed: || member.Isversion            // (perhaps exclude associations and timestamp/rowversion? too)            // if you get problems,try using StorageAccessor instead -            // this will typically skip valIDation,etc            member.MemberAccessor.SetBoxedValue(                ref dbrow,member.MemberAccessor.GetBoxedValue(obj));        }        // submit changes here?    }
总结

以上是内存溢出为你收集整理的C#Linq-SQL:存储库模式的UpdateByID方法全部内容,希望文章能够帮你解决C#Linq-SQL:存储库模式的UpdateByID方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1218773.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存