EntityFramework数据库第一 - 类型映射 - 将SQL中的二进制(8)映射到C#中的int

时间:2016-07-29 07:35:21

标签: c# entity-framework entity-framework-6

在SQL中我有一个主键为二进制(8)的表。当我使用Update Model from Database将该表添加到我的模型时,我可以看到此列的类型为Binary

enter image description here

在C#中,我将该列作为byte[]

我可以将该列映射到int吗?

我知道我可以在SQL中使用CAST创建一个视图:

SELECT
    Client_Id,
    CAST(Client_Id AS INT) AS NewClient_Id,
    * /*other columns*/
FROM
    dbo.Clients

但这不是解决方案,因为我必须能够编写,而不仅仅是从该表中读取。我知道我可以为插入创建存储过程,但我想避免这种情况。

我是EntityFramewor 6.1.3。

4 个答案:

答案 0 :(得分:2)

您有3种不同的解决方案

x存储过程但您不想要它们。

x将未映射的属性添加到您的类中。此解决方案的最大问题是您无法使用未映射的属性进行查询。您必须将所有数据读取到客户端,然后在客户端上的非映射属性上应用条件(因此您的应用程序不可扩展)。

[NotMapped]
public long LongClientId
{
    get { return BitConverter.ToInt64(this.ClientId, 0); }
    set { this.ClientId = BitConverter.GetBytes(value); }
}

此查询无法正常工作

context.MyDbSet.Where(m => m.LongClientId == 12).ToList();

你需要以这种方式改变它

context.MyDbSet.ToList().Where(m => m.LongClientId == 12);

此查询的结果是您将所有表的记录(从dbms传输到您的应用程序)加载到列表中而不是您获取所需的记录。

x创建一个视图(可能是索引视图)并使用INSTEAD OF触发器。

答案 1 :(得分:0)

我知道你为什么不坚持数据库结构和页面的c#代码中的int或byte

答案 2 :(得分:0)

根据我的经验,映射过程很容易混淆,尤其是在更新现有地图时。出于这个原因,我建议你使用

long CurrentClientId = BitConverter.ToInt64(Rec.ClientId) 

阅读和

Rec.ClientId = BitConverter.GetBytes(CurrentClientId) 

写。您可能已经有一个包装器来按摩记录,因为它们被读入内部结构,这只是一步。

请注意,这并没有注意您认为在字节数组中有的字节顺序,但至少该过程将正确地往返。

答案 3 :(得分:0)

您可以在模型内部处理转换,如下所示:

    [NotMapped]
    public long ClientId
    {
        get { return BitConverter.ToInt64(this.ClientIdBytes, 0); }
        set { this.ClientIdBytes = BitConverter.GetBytes(value); }
    }

    [Column("ClientId")]
    public byte[] ClientIdBytes { get; set; }

调用者使用ClientId作为long,但此属性未映射到数据库。 getter和setter只是将值转换为第二个属性,该属性保存在ClientId数据库列名中。