2015-10-07 78 views
0

我有一個系統使用實體框架對運行良好的SQL Server數據庫。最近我決定將MySql作爲後端。該錯誤是由一些對SQLServer運行良好的代碼造成的,但是對MySql失敗。MySql實體框架auto_increment錯誤

MySql 5.6.27,EF6。

我有一個表有1列(稱爲Id),我想用作序列計數器。我通過將Id作爲主鍵和auto_generated來實現這一點。

下面是表DEF:

create table tblCompanySequence (
    Id int auto_increment primary key not null default 1 
); 

下面是相應的C#DEF:

using System.Data.Linq.Mapping; 

namespace Foo.DataAccess.EF.Entity 
{ 
    [Table(Name = "tblCompanySequence")] 
    public class EFCompanySequence 
    { 
     [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
     public int Id { get; set; } 
    } 
} 

這裏是代碼:

var newSeq = new EFCompanySequence(); 
var tableSeq = context.GetTable<EFCompanySequence>(); 
tableSeq.InsertOnSubmit(newSeq); 
context.SubmitChanges(); 
var newId = newSeq.Id; 

我就得到一個錯誤致電提交更改。

A first chance exception of type 'MySql.Data.MySqlClient.MySqlException' occurred in System.Data.Linq.dll 

Additional information: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT VALUES 

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS `value`' at line 1 

我已經嘗試了數排列,e.g:

create table tblCompanySequence (
    Id int auto_increment not null, 
    primary key (Id) 
); 

,並使用EF表對象DbGenerated註解,但仍創下了同一面牆上。

任何建議非常感謝。

乾杯, 安迪

UPDATE 1:

這裏是我的配置設置(設置爲每https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html

<configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
</configSections> 

<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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
</system.data> 

<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"/> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
</entityFramework> 

更新2:

我閱讀另一個網站,我可以能夠使用下面的代碼來克服這一點。

var newId = context.ExecuteCommand("insert into tblCompanySequence values (null); select LAST_INSERT_ID();"); 

此代碼成功地插入新行與遞增的ID到數據庫中,但是從選擇的返回值始終爲1

我敢肯定,這一定有什麼明顯我做錯誤。

+0

scope_idntity()是一個tsql函數,而不是一個mysql函數。你配置EF使用MySQL而不是MS SQL? – Shadow

+0

談到MySql時,我是一個相對的noob。我在連接字符串上設置了Sql Server Mode開關。你是這個意思嗎。 andy

回答

0

你可以配置你的EntityFramework使用MySql,然後它將使用LAST_INSERT_ID()而不是score_identity()。看看配置文件

<connectionStrings> 
<add name="DefaultConnection" 
providerName="MySql.Data.MySqlClient" 
connectionString="[Insert your ConnectionString to the mysql database here]"/> 
</connectionStrings> 
+0

這裏是我的 - 看起來不錯我的 andy

0

如果你真的需要這個,你可以在這個語法的幫助下實現你的目標。試試這個,並根據你的需要進行修改:

CREATE TABLE table1_seq 
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
); 

CREATE TABLE table1 
(
id VARCHAR(7) NOT NULL PRIMARY KEY DEFAULT '0', name VARCHAR(30) 
); 

試試這個。我希望你能明白,

+0

您的第一個創建聲明看起來與我的相同,但不包括默認的1(這是我嘗試的另一種排列方式)。我不明白在這方面第二次創建聲明應該做什麼 - 你可以進一步解釋一下嗎? – andy

0

你建議立即進行刪除配置的EntityFramework與MySQL 工作,請根據您的需求

語法的MySQL 下面的SQL語句定義的「ID」列是以下的sode在 「人」 表自動增量的主鍵字段:

CREATE TABLE人員 ( ID INT NOT NULL AUTO_INCREMENT, 名字VARCHAR(255)NOT NULL, 姓VARCHAR(255), 地址VARCHAR(255 ), City varchar(255), PRIMARY KEY(ID) )

+0

這就是我所擁有的 - 請參閱上面的問題:create table tblCompanySequence( Id int auto_increment not null, primary key(Id) ); – andy

0

我想我可能已經找到了答案(但還沒有令人滿意的解決方案)。

我使用LINQ到SQL(不LINQ到實體),而且似乎也沒有現成的支持該在MySql.Data等

我已經開始與出發linqExpress打解決方案,但初看起來,我將不得不重寫大量代碼才能完成這項工作。

除非任何人有另一種解決方案。

乾杯。