我有一个订阅表,起初我们有一个名为Subscription的类的直接映射。我们更改了该映射,现在SubscriptionDto类映射到订阅表。
我对DatabaseContext类所做的更改:
对于CompanyRepresentation,DatabaseContext中有这样的配置:
SubscriptionDto类与Subscription类相同,Subscription类唯一没有的是每个集合属性上的virtual关键字。它看起来像这样:
在代码中,它将Subscription类用于数据库和数据库,但由于它已被SubscriptionDto类替换,因此需要进行转换。这是在存储库类SubscriptionsInSql:
中完成的
在尝试将subscriptionDto.CompanyRepresentation分配给CompanyRepresentation时,从SubscriptionDto转换为Subscription的代码会抛出错误:“已经有一个与此命令关联的打开的DataReader必须先关闭”。
如果我查看ForAccountWith方法中检索到的内容,我发现还有一个例外:
我尝试过很多东西,比如删除虚拟关键字,数据注释等等,但我似乎无法弄清楚这一点是否有效。一些帮助将不胜感激!
答案 0 :(得分:1)
请注意Find理论上只检索一个实体。
请尝试:
List<Subscription> res = new List<Subscription>();
foreach (SubscriptionDto dto in repository.Where(x => x.AccountId == accountId)) {
res.Add(CreateSubscription(dto));
}
return res;
答案 1 :(得分:1)
错误“已经有一个与此命令关联的打开的DataReader必须先关闭”通常意味着您没有在连接字符串中启用多个活动结果集(MARS)。
例如:
Data Source=<db>;Initial Catalog=db;Integrated Security=SSPI;MultipleActiveResultSets=True
但是,看看你的代码,我认为你误解了你的要求。您似乎正在尝试使用SubscriptionDto替换Subscription,但这不是DTO模式通常的工作方式。几乎可以肯定,您需要在存储库层中将Subscription转换为SubscriptionDto。 Dto是数据传输对象,用作数据层与业务或其他层之间的中介。这会将您的数据层与其他图层分离。