在SQL中我有一个主键为二进制(8)的表。当我使用Update Model from Database
将该表添加到我的模型时,我可以看到此列的类型为Binary
在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。
答案 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数据库列名中。