当前位置:  开发笔记 > 数据库 > 正文

如何为LINQ to SQL编写Upsert?

如何解决《如何为LINQtoSQL编写Upsert?》经验,为你挑选了1个好方法。

所以我想为LINQ to SQL编写一个通用的Upsert函数,我在构思它的过程中遇到了一些麻烦.我希望它能像这样工作:

var db = new DataContext();
db.Customers.UpsertOnSubmit(customer);

所以它必须在某种程度上是通用的,我猜和表上的扩展方法.在确定基础表的主键时,我已经能够做到这一点:

var context = source.Context;
var table = context.Mapping.GetTable(source.GetType());
var primaryMember = table.RowType.DataMembers.SingleOrDefault(m => m.IsPrimaryKey);

我假设有必要让这个来组成一个查询来判断该项是否已经在数据库中,但我现在还不知道如何处理它.



1> ericvg..:

我做了类似的事情,但采用了不同的方法.每个实体都实现IEntity.IEntity如果对象是新对象或现有对象,则属性之一是状态.然后,我为每个实体实现,例如:

public EntityState EntityState
{
    get
    {
        if (_Id > 0)
            return EntityState.Exisiting;
        else
            return EntityState.New;
    }
}

然后,泛型Upsert可以(在通用存储库类型类上):

public virtual void Upsert(Ta entity)
    where Ta: class
{
    if (!(entity is IEntity))
        throw new Exception("T must be of type IEntity");

    if (((IEntity)entity).EntityState == EntityState.Exisiting)
        GetTable().Attach(entity, true);
    else
        GetTable().InsertOnSubmit(entity);
}

private System.Data.Linq.Table GetTable()
    where Ta: class
{
    return _dataContext.Context.GetTable();
}

如果从另一个datacontext附加,还要确保在对象上有时间戳.


嗯...一个upsert的重点是你不知道它是否存在,你只是想让数据库拥有新的内容; upsert会为您节省"额外往返"以确定.你的解决方案没有回答这个问题 我们需要的是一个sql`MERGE`,如下所述:http://stackoverflow.com/questions/2479488/syntax-for-single-row-merge-upsert-in-sql-server.
推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有