相关疑难解决方法(0)

使用XML数据库字段的Linq-to-SQL - 为什么这样做?

一些背景:我有一个数据库,我想使用linq-to-sql通过C#应用程序进行更新.此表中的一列具有XML数据类型.

该表中的每个其他列(不是XML数据类型)都可以完美地更新,但是当我对XML字段进行更改时,程序(看似)正确执行,但是在我之后字段始终保留其原始值跑SubmitChanges().

我浏览了一下互联网,发现Microsoft Connect上的一些帖子诊断出类似的问题,最后在这里偶然发现了解决方案:

要强制XML字段更新,这不会:

XElement tmp = MyLinqObject.XmlField;
MyLinqObject.XmlField = null;
MyLinqObject.XmlField = tmp;
Run Code Online (Sandbox Code Playgroud)

而不是强迫LINQ更新XML列分配克隆对象:

MyLinqObject.XmlField = new XElement (MyLinqObject.XmlField);
Run Code Online (Sandbox Code Playgroud)

我可以确认这似乎确实有效,但我不确定为什么.我唯一的猜测是XmlField属性在堆上有某种唯一标识符,通过制作克隆,你已经为它分配了一个新的唯一标识符.当Linq然后生成查询时,它甚至不会尝试查看该字段是否已更新,因为它有一个新的id,它只是将值写入数据库.但是,我只是在猜测并希望其他人能够更好地了解幕后发生的事情.

编辑:为了解决Jon的帖子,问题的原因(正如在MS Connect网站上解释的那样)是"XML字段不会更新,因为Linq-to-SQL不处理XElement.Changed事件".

对于我的实现,有效的代码最终看起来像这样:

MyXElementProperty.SetElementValue("Author", author);

MyXElementProperty = new XElement(MyXElementProperty);
Run Code Online (Sandbox Code Playgroud)

作为参考(对于发现此问题的任何其他人),以下内容也有效:

MyXElementProperty = new XElement(MyXElementProperty);

MyXElementProperty.SetElementValue("Author", author);
Run Code Online (Sandbox Code Playgroud)

c# xml .net-3.5 linq-to-sql

10
推荐指数
1
解决办法
5626
查看次数

当XElements具有相同名称时,如何使用LINQ查询来获取XElement值

我有一个像下面这样的xml:

<Table>
  <Record>
    <Field>Value1_1</Field>
    <Field>Value1_2</Field>
  </Record>
  <Record>
    <Field>Value2_1</Field>
    <Field>Value2_2</Field>
  </Record>
</Table>
Run Code Online (Sandbox Code Playgroud)

我想要的是一个LINQ查询,它生成一个IEnumerable,我可以将其指定为DataGrid的数据源.我到目前为止的内容如下:

var temp = from record in table.Elements("Record")
            select record.Element("Field").Value
Run Code Online (Sandbox Code Playgroud)

我可以拥有多个场元素的事实是我的绊脚石.

在上面的例子中,我需要的是类似的东西IEnumerable<string,string>.datagrid看起来像这样:

Value1_1, Value1_2
Value2_1, Value2_2
Run Code Online (Sandbox Code Playgroud)

c# linq-to-xml

8
推荐指数
2
解决办法
6万
查看次数

使实体类关闭以进行更改

我有一个数据库关系,如下所示.域对象是基于LINQ to SQL ORM创建的.

付款包括现金付款和礼品券付款.假设购买总额为550.可以按以下组件支付

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我正在使用ORM的"InsertOnSubmit"功能插入新的付款记录.以下代码工作正常.但是,如果我公司使用信用卡引入新的支付组件,我需要更改我的"付款"域类.如何使支付类打开以进行扩展并关闭仍在使用ORM的更改?

注意:Payment类具有行为(例如GetTotalAmountCollected).我正在努力使"付款"类满足OCP.

注意:优惠券类型有特定的行为.优惠券发行日期是否小于2000年1月1日,它不应用于计算总金额(即,CouponValue应为零).请参阅使用策略模式重构代码.

注意:我使用的是.Net 4.0

参考:

  1. 将ObjectContext.AddObject与Entity Framework一起使用时出错
  2. 使用策略模式重构代码
  3. 喜欢构成而不是继承?
  4. 代码优先与模型/数据库优先
  5. 使用Unity的策略模式和依赖注入
  6. 委托与OOP的C#策略设计模式
  7. 如何在C#中使用策略模式?
  8. 继承与EF代码第一:第2部分-每个类型表(TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每类型tpt.aspx

C#代码:

public class PaymentAppService
{
    public RepositoryLayer.ILijosPaymentRepository Repository { get; set; }

    public void MakePayment()
    {
        DBML_Project.Payment paymentEntity = new DBML_Project.Payment();
        paymentEntity.PaymentID = 1;
        paymentEntity.PaymentType = "PurchaseP";

        DBML_Project.CashPayment cashObj = new …
Run Code Online (Sandbox Code Playgroud)

.net c# domain-driven-design entity-framework linq-to-sql

7
推荐指数
1
解决办法
851
查看次数

如何使用Linq to SQL将对象序列化并将对象保存为Xml

我正在使用FileStream将对象序列化为Xml并保存到磁盘

Stream str = new FileStream(@"serializedstate.xml", FileMode.OpenOrCreate)
XmlSerializer x = new XmlSerializer(typeof(GridState));
x.Serialize(str, new GridState
        {
            GridName= txtGridName.Text,
            GridColumns = GetGridColumnStates()
        });
Run Code Online (Sandbox Code Playgroud)

这工作正常,并在磁盘上生成Xml文件.如何使用Linq to SQL将序列化的对象作为Xml保存到Sql Server 2008数据库的XML列中?以及如何从数据库反序列化相同的内容?

c# xml-serialization linq-to-sql

6
推荐指数
1
解决办法
5956
查看次数

ORM引入的循环大大降低了性能

我有一张桌子如下图所示.它有固定和储蓄类型的帐户.我需要更新用户1的所有帐户的状态.该用户有10000个帐户.本质上,逻辑将如以下SQL存储过程脚本中所示.该脚本执行时间不到1秒(83毫秒).

但是当我使用LINQ to SQL将其转换为ORM时,它需要超过3分钟(204814毫秒).它至少慢了240,000%.

LINQ to SQL(或其他ORM)中是否存在有助于克服性能损失的模式?

有什么能迫使它在一次数据库中进行更新?

注意:我知道从LINQ调用存储过程.我不认为这是ORM而不是我的选择.

在此输入图像描述

手动存储过程脚本

DECLARE @UserID INT 
DECLARE @StatusForFixed VARCHAR(50)
DECLARE @StatusForSavings VARCHAR(50)

SET @UserID = 1
SET @StatusForFixed = 'FrozenFA11'
SET @StatusForSavings = 'FrozenSB22'

UPDATE BankAccount 
SET Status = 
        CASE 
            WHEN BankAccount.AccountType='Fixed' THEN @StatusForFixed
            WHEN BankAccount.AccountType='Savings' THEN @StatusForSavings
        END
 WHERE  AccountOwnerID=@UserID
Run Code Online (Sandbox Code Playgroud)

LINQ生成的代码示例

Note: This type of statements happen 10000 times

UPDATE [dbo].[BankAccount]
SET [Status] = @p3
WHERE [BankAccountID] = @p0
-- @p0: Input Int (Size = -1; …
Run Code Online (Sandbox Code Playgroud)

c# linq-to-sql

0
推荐指数
1
解决办法
159
查看次数