0

使用 EF5 Fluent API 是否有人知道是否可以在数据库中有一个二进制列,但在 C# 中是否有一个长列?当我们在实体中放置一个 long 时,我们总是会在运行时出现 EF 错误(无法执行映射)。如果我们放置一个 byte[] 则一切正常(db 中的二进制通常意味着 .NET 代码中的 byte[] 类型)。我们无法更改数据库列类型,因此这不是解决方案。

这是我们最终要做的事情:

from l in LeadDataRepository.GetAll()
select new { // we need an anonymous type here we use Linq to Entities
    FirstName = l.FirstName,
    LastName = l.LastName,
    CompanyName = l.CompanyName,
    CityId = l.CityId,
    DbID = l.DbId
 }).ToList() // once listed we use Linq to objects
.Select(l => new LeadListingViewModel() { // our real class
    FirstName = l.FirstName,
    LastName = l.LastName,
    CompanyName = l.CompanyName,
    CityId = l.CityId.ToLong(), // here we use our extension method on byte[] which converts to long
    DbID = l.DbId.ToLong()
})

如果我们能够在实体中指定 CityId 是 long(而不是 byte[])并且对于 DbId 也是如此,那么我们就不必执行所有这些冗余代码。因此这是不可能的,EF 在运行时抱怨(因为 db 列类型是二进制的)。但是 SQL Server 处理从二进制到 bigint 的隐式转换......

4

1 回答 1

0

你可以使用BitConverter

static void Main(string[] args)
{
    long number = 1234167237613;

    //convert to byte array
    byte[] bytes = BitConverter.GetBytes(number);

    //vice-versa
    long number2 = BitConverter.ToInt64(bytes, 0);

    Console.WriteLine(number == number2);
}

编辑:

好的,我明白你的问题了。您需要的是一个 Fluent API,它可以为您自动转换为byte[]long反之亦然。不幸的是,Fluent API 无法为您进行转换。

但幸运的是,您可以拥有一个表示该byte[](二进制)属性的包装器属性,该属性仅供您的 C# 代码使用。您只需将此包装器属性标记[NotMapped]为不属于您的数据库架构的一部分。然后,您只需在每次需要修改此二进制数据时使用该包装器属性。

这是一个例子;

namespace EntityFrameworkByteToLong.Models
{
    public class SomeEntity
    {
        public int Id { get; set; }

        public byte[] SomeBytes { get; set; } //this is the column in your DB that can't be changed

        [NotMapped]
        public long SomeByteWrapper //your wrapper obviously
        {
            get
            {
                return BitConverter.ToInt64(SomeBytes, 0);
            }
            set
            {
                SomeBytes = BitConverter.GetBytes(value);
            }
        }
    }
}

然后您可以通过以下方式使用该包装器:

        using(var ctx = new UsersContext())
        {
            SomeEntity s = new SomeEntity();
            s.SomeByteWrapper = 123861234123;

            ctx.SomeEntities.Add(s);
            ctx.SaveChanges();
        }
于 2013-06-11T07:13:17.200 回答