优化存储库的方法的SubmitChanges(Optimizing Repository’s Sub

2019-06-25 22:05发布

我有以下库。 我有使用工厂LINQ 2 SQL生成的类和域对象之间的映射。

下面的代码将工作; 但我看到两个潜在的问题

1)这是更新语句之前,使用一个SELECT查询。

2)需要更新所有列(不仅是改变列)。 这是因为我们不知道所有列在域对象得到了改变根本。

如何克服这些缺点?

注:可以有系统会根据特定的列更新执行的情况下(如触发器)。 因此,我不能不必要更新的列。

参考

  1. LINQ to SQL的:更新不刷新时“UpdateCheck的=从不”

  2. http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=113917

namespace RepositoryLayer
{
public interface ILijosBankRepository
{      
    void SubmitChangesForEntity();
}

public class LijosSimpleBankRepository : ILijosBankRepository
{

    private IBankAccountFactory bankFactory = new MySimpleBankAccountFactory();
    public System.Data.Linq.DataContext Context
    {
        get;
        set;
    }


    public virtual void SubmitChangesForEntity(DomainEntitiesForBank.IBankAccount iBankAcc)
    {
        //Does not get help from automated change tracking (due to mapping)

        //Selecting the required entity
        DBML_Project.BankAccount tableEntity = Context.GetTable<DBML_Project.BankAccount>().SingleOrDefault(p => p.BankAccountID == iBankAcc.BankAccountID);

        if (tableEntity != null)
        {
            //Setting all the values to updates (except primary key)
            tableEntity.Status = iBankAcc.AccountStatus;

            //Type Checking
            if (iBankAcc is DomainEntitiesForBank.FixedBankAccount)
            {
                tableEntity.AccountType = "Fixed";
            }

            if (iBankAcc is DomainEntitiesForBank.SavingsBankAccount)
            {
                tableEntity.AccountType = "Savings";
            }

            Context.SubmitChanges();
        }
    }
}

}

namespace DomainEntitiesForBank
{

public interface IBankAccount
{
    int BankAccountID { get; set; }
    double Balance { get; set; }
    string AccountStatus { get; set; }
    void FreezeAccount();

}

public class FixedBankAccount : IBankAccount
{

    public int BankAccountID { get; set; }
    public string AccountStatus { get; set; }
    public double Balance { get; set; }

    public void FreezeAccount()
    {
        AccountStatus = "Frozen";
    }
}


}

Answer 1:

如果我理解你的问题,你正在传递,你需要保存到数据库中不知道什么原始值是一个实体,或列的实际变化。

如果是这样的话,那么你有四个选项

  1. 你需要去回数据库,查看原始值,即进行选择,因为你的代码在做什么。 这允许您设置的所有实体值和LINQ2SQL会照顾它的列实际改变。 所以,如果你没有列的实际变化,则没有更新语句被触发。

  2. 你需要避免的选择,只是更新列。 你已经知道怎么做(但对于其他人看到这个问题和答案 )。 既然你不知道哪些列发生了变化,你别无选择,只能将它们全部。 这将产生即使没有列被实际改变的更新语句,这可以触发任何数据库触发器。 除了禁用触发器,你可以在这里做的唯一的事情是确保触发器被写入检查新旧列中的值,以避免任何进一步的不必要的更新。

  3. 您需要更改您的要求/程序,以便您需要的新旧和实体值,因此可以判断哪些列,而不必返回到数据库中已经改变。

  4. 不要使用LINQ为您更新。 LINQ代表语言集成查询 ,它是(恕我直言)在查询辉煌,但我总是看着更新/删除功能作为一个额外的奖金,但不是它是专为。 另外,如果定时/性能是至关重要的,那么有没有办法,LINQ将匹配正确的手工制作SQL。



Answer 2:

这是不是一个真正的问题,DDD; 从我可以告诉你,都在问:

使用LINQ产生不选择直接更新

凡接受的答案是否定的不可能的 ,但那里有更高的投票的回答表明您可以一个对象的背景下发起的数据上下文的变化跟踪。

您对关闭触发器第二点已经回答了在这里和这里 。 但是,正如其他人评论你真的需要触发器? 如果你不控制代码这些更新?

总的来说,我认为你正在寻找过早的优化。 您正在使用ORM和的那部分你在L2S信任使数据库水暖决定你。 但要记住在适当情况下,你可以使用存储过程执行特定的SQL。



文章来源: Optimizing Repository’s SubmitChanges Method