无法评估EF Code First Error Message表达式

时间:2014-06-16 08:07:15

标签: c# entity-framework ef-code-first

我有一个订阅表,起初我们有一个名为Subscription的类的直接映射。我们更改了该映射,现在SubscriptionDto类映射到订阅表。

我对DatabaseContext类所做的更改:

ChangesDatabaseContext

对于CompanyRepresentation,DatabaseContext中有这样的配置:

DbConCompRep

SubscriptionDto类与Subscription类相同,Subscription类唯一没有的是每个集合属性上的virtual关键字。它看起来像这样:

SubscriptionsDto

在代码中,它将Subscription类用于数据库和数据库,但由于它已被SubscriptionDto类替换,因此需要进行转换。这是在存储库类SubscriptionsInSql:

中完成的

SubscriptionsInSql

在尝试将subscriptionDto.CompanyRepresentation分配给CompanyRepresentation时,从SubscriptionDto转换为Subscription的代码会抛出错误:“已经有一个与此命令关联的打开的DataReader必须先关闭”。

如果我查看ForAccountWith方法中检索到的内容,我发现还有一个例外:

ErrorMessageOnEvaluation

我尝试过很多东西,比如删除虚拟关键字,数据注释等等,但我似乎无法弄清楚这一点是否有效。一些帮助将不胜感激!

2 个答案:

答案 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是数据传输对象,用作数据层与业务或其他层之间的中介。这会将您的数据层与其他图层分离。