数据类型不匹配将现有数据库映射到EF

时间:2016-07-29 22:36:48

标签: sql entity-framework linq-to-sql data-annotations

我正在使用现有的生产数据库来创建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,以便付款可以作为虚拟属性引用?

2 个答案:

答案 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)