我有下面的存储库。我在LINQ2SQL生成的类和使用工厂的域对象之间进行了映射。
下面的代码可以工作,但是我看到了两个潜在的问题
1)在update语句之前使用SELECT查询。
2)它需要更新所有列(不仅仅是已更改的列)。这是因为我们不知道域对象中的所有列都发生了什么变化。
如何克服这些缺点?
注意:可以根据特定的列更新执行一些场景(比如触发器)。因此,我不能不必要地更新列。
参考
码
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";
}
}
}发布于 2012-06-30 11:09:19
如果我理解您的问题,您将被传递给一个需要保存到数据库中的实体,而不知道原始值是什么,或者哪些列实际上已经更改。
如果是这样的话,那么您有四个选择
发布于 2012-06-30 06:24:52
这并不是一个真正的DDD问题;据我所能告诉你的是:
Use linq to generate direct update without select
如果接受的答案是不可能的,但是有一个更高的投票结果,建议您可以将一个对象附加到您的上下文中,以启动数据上下文的更改跟踪。
关于禁用触发器的第二点已经回答了here和here。但正如其他人所言,你真的需要触发器吗?您不应该在代码中控制这些更新吗?
一般来说,我认为您正在考虑过早的优化。您正在使用ORM,并且作为其中的一部分,您信任L2S为您做出数据库管道决策。但是,请记住,在适当的地方,您可以使用存储过程执行特定的SQL。
https://stackoverflow.com/questions/11262785
复制相似问题