【发布时间】:2023-03-25 12:12:01
【问题描述】:
我正在使用现有的生产数据库创建 MVC 应用程序,但由于数据类型不匹配,我无法正确设置父类的虚拟属性。我的代码如下:
public class bill {
public int billId { get; set; }
.........
}
public class meter {
public int meterId { get; set; }
public int billId { get; set; }
.....
}
public class payment {
public int paymentId { get; set; }
public long billId { get; set; }
......
}
我在账单类中添加了以下内容:
public virtual ICollection<meter> Meters { get; set; }
public virtual ICollection<payment> Payments { get; set; }
我能够检索相关的计量表,但由于付款中billid 的数据类型为 long,我收到错误消息。有没有什么方法可以在不影响原始数据库的情况下正确映射代码优先模型?
我收到错误:
列名“bill_billId”无效。
列名“bill_billId”无效。
列名“bill_billId”无效。
尝试如下显示时:
@foreach (var m in Model.Meters.Where(x => x.archived != true && x.meterUnitsUsed > 0))
{
<tr>
<td>@Html.DisplayFor(x => m.meterSerialNumber)</td>
<td>@Html.DisplayFor(x => m.meterOpeningRead)</td>
<td>@Html.DisplayFor(x => m.meterClosingRead)</td>
<td>@Html.DisplayFor(x => m.meterUnitsUsed)</td>
<td>@Html.DisplayFor(x => m.archived)</td>
<td>@Html.DisplayFor(x => m.meterUnitType)</td>
<td>@Html.DisplayFor(x => m.meterUnitPrice)</td>
<td>@Html.DisplayFor(x => m.meterAmount)</td>
@foreach (var i in Model.LiftsRefunds.Where(i => i.archived != true))
{
<td>@Html.DisplayFor(x => i.liftRefundDate)</td>
<td>@Html.DisplayFor(x => i.liftRefundAmount)</td>
<td>@Html.DisplayFor(x => i.liftType)</td>
}
</tr>
}
当前使用的数据库设置错误,子类使用long数据类型,而父类的主键是int。是否有任何方法可以设置 EF 以忽略这一点并将 long 映射到 int 以便可以将付款作为虚拟属性引用?
【问题讨论】:
-
好吧,你在
meter类中有billId作为 int。不应该也很长吗? -
此外,每当您说遇到错误时,您应该始终提供准确的错误消息。表定义也会有所帮助。
-
meter 类工作正常,支付表的 billid 设置为 long,但在 billid 和 Meterid 中,它们都设置为 int,如果我最终更改上下文,我不想要正在更改的数据库
-
在您的数据库中不是所有对
billId的引用都具有相同的数据类型吗? -
不是问题所在,它是一个现有的数据库,但我正在尝试将其用作 EF 上下文
标签: sql entity-framework linq-to-sql data-annotations