0

EF5 Fluent API を使用すると、データベースにバイナリ列があり、C# に long がある可能性があるかどうかは誰にもわかりませんか? エンティティに 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 APIbyte[]ですlong。残念ながら、Fluent API は変換を行うことができません。

But fortunately, you can have a wrapper property representing that byte[] (binary) property which is just for your C# code's use. You just have to mark this wrapper property as [NotMapped] in order for it not be part of your DB schema. Then you just have to use that wrapper property every time you need to modify this binary data.

Here's an example;

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);
            }
        }
    }
}

Then you can use that wrapper by:

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

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