我正在使用现有的生产数据库来创建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
长数据类型,我收到错误。有没有任何方法可以正确映射,而不需要更改代码影响原始数据库的第一个模型?
我收到错误:
列名称'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>
}
当前正在使用的数据库设置错误,无法使用子类的长数据类型,而父类的主键是int。有没有办法设置EF来忽略这个并将long映射到int,以便付款可以作为虚拟属性引用?
答案 0 :(得分:1)
我认为你有两个不同的问题。
===
首先,payment.billId
是对bill.billId
的引用,我们假设它们在SQL Server上有2个不同的列(每个表一个)。
1.如果您忽略迁移(实际上您忽略了迁移并且没问题),如果SQL Server中的数据类型与类的数据类型不同,即SQL Server上的int和bigint以及您的int和int,则程序也会起作用。类。
2.但SQL Server无法建立从bigint列到int列的关系,因此在您的数据库中,您不能将bigint和int用于两列,或者您没有关系(您没有,EF)无论如何都会工作,但这不是一个好习惯)。
所以我建议你检查你在SQL Server上做了什么,然后更改类的数据类型(即设置所有int)并禁用迁移。
===
现在,为什么关于非现有领域的错误呢?
在您的类中,您有映射配置问题。
您必须将payment.billId
属性与public virtual ICollection<payment> Payments { get; set; }
相关联。
我使用流畅的映射和每个类的一个映射文件,所以在这种情况下我写的付款映射文件
HasRequired(t => t.bill)
.WithMany(t => t.Payments)
.Map(d => d.MapKey("billId"));
您可以对属性执行相同的操作。
答案 1 :(得分:0)
错误:
'payment'上的'billId'属性无法设置为'System.Int64'值。您必须将此属性设置为“System.Int32”
类型的非null值
按照说明here:
在您的EDMX中,如果您在Y表下并单击X列,右键单击,单击属性,向下滚动到Nullable并从False更改为True。
如果出现“映射片段”错误,则必须从EDMX中删除该表并重新添加它,因为在模型浏览器中它存储表属性以及刷新它的唯一方法(即知道)是从.Store下的模型浏览器中删除表,然后使用Update Model from Database ..命令检索它。
有关详细信息,请参阅MSDN文档:How to: Update an .edmx File when the Database Changes (Entity Data Model Tools)