2015-06-25 55 views
0

我正在使用Entity Framework和MySql。Entity Framework + MySql + Guid錯誤

我在使用Guid屬性在數據庫中插入項目時遇到問題。

我得到的錯誤是:Incorrect string value: '\x9D?Z\xC2\x1C\xB2...' for column 'Id' at row 1

如果我從Guid屬性ID更改爲string,它工作正常。

該表的整理設置爲utf8 - default collation。我已將其更改爲uft8mb4 - default collation,完全沒有任何效果。

Id屬性數據類型是VARCHAR(64) PK NN UQ

這裏是簡化代碼

public class AppFormAppUnitOfWork : DbContext 
{ 
    public DbSet<MenuItem> MenuItems { get; set; } 
} 

static void MySqlGuid(AppFormAppUnitOfWork unitOfWork) 
{ 
    MenuItem menuItem = new MenuItem(); 
    menuItem.Id = Guid.NewGuid(); 
    menuItem.MenuItem_Name = "Hello World"; 

    unitOfWork.MenuItems.Add(menuItem); 

    using (var trans = new TransactionScope()) 
    { 
     // throws 
     // Incorrect string value: '\x9D?Z\xC2\x1C\xB2...' for column 'Id' at row 1 
     unitOfWork.SaveChanges(); 

     trans.Complete(); 
    } 
} 

static void MySqlString(AppFormAppUnitOfWork unitOfWork) 
{ 
    MenuItem menuItem = new MenuItem(); 
    menuItem.Id = Guid.NewGuid().ToString(); 
    menuItem.MenuItem_Name = "Hello World"; 

    unitOfWork.MenuItems.Add(menuItem); 

    using (var trans = new TransactionScope()) 
    { 
     // works ok 
     unitOfWork.SaveChanges(); 
     trans.Complete(); 
    } 
} 

這裏是web.config設置

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 

    <connectionStrings> 
    <add name="AppFormAppUnitOfWork" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=appformapp;uid=root;password=microsoft;Old Guids=true;Charset=utf8;" /> 
    </connectionStrings> 

    <system.data> 
    <DbProviderFactories> 
     <remove invariant="MySql.Data.MySqlClient" /> 
     <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
    </system.data> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"> 
     </provider> 
    </providers> 
    </entityFramework> 
</configuration> 

的包(實體框架MySql提供程序)我使用的是:

<packages> 
    <package id="EntityFramework" version="6.0.0" targetFramework="net45" /> 
    <package id="MySql.Data" version="6.9.6" targetFramework="net45" /> 
    <package id="MySql.Data.Entity" version="6.9.6" targetFramework="net45" /> 
</packages> 

我該如何解決此問題而不將所有Guid屬性更改爲字符串?

+0

'CHARSET'應該是連接字符串的大寫字母 –

回答

0

在MySql中不直接支持GUID。存儲它的正確結構是BINARY(16)(您可以使用Guid.ToByteArray存儲GUID)。如果你想保持一個varchar(我從來沒有使用二進制存儲IDS),你可以使用

menuItem.Id = String.Format("{0:N}", Guid.NewGuid()); 
-1

使用CHAR(36),而不是VARCHAR(64)。 EF會自動將其正確映射。順便說一下,Dapper也是如此。我已經使用了BINARY(16)和各種VARCHAR()組合,並且使用ORM進行了實驗。同樣,BINARY(16)也會失去人的可讀性,這會使調試變得困難。我不知道爲什麼MySQL文檔推薦VARCHAR(64);它是矯枉過正的,並且uniqueidentifiers總是正好是36個字節長,所以var字節是浪費空間。