2012-09-12 15 views
7

मैंने अपनी समस्या का हल ढूंढने का प्रयास किया लेकिन अब तक मेरे प्रयास व्यर्थ थे। :-(MySQL 5.5 + .NET कनेक्टर + इकाई फ्रेमवर्क + माइग्रेशन = स्वरूप अपवाद

मैंने विजुअल स्टूडियो 2010, .NET Framework 4, C#, इकाई फ्रेमवर्क 5.0, MySQL 5.5 और यह संबंधित .NET कनेक्टर (संस्करण 6.5.4) का उपयोग कर एक वेब प्रोजेक्ट बनाया है। मैं पहले कोड का उपयोग कर रहा हूं । संस्थाओं और हे/आर मानचित्रण के लिए दृष्टिकोण

समस्या मैं का सामना करना पड़ रहा हूँ

कि मैं निष्पादित करने के लिए क्या एक सरल प्रवास का लग रहा था असमर्थ हूँ है यहाँ मेरी इकाई वर्ग हैं:।

public class Usuario 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string NomeCompleto { get; set; } 

    [Required] 
    [StringLength(100)] 
    [DataType(DataType.EmailAddress)] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(30)] 
    public string Login { get; set; } 

    [Required] 
    [StringLength(64)] 
    public string Senha { get; set; } 

    [Required] 
    public bool Ativo { get; set; } 

    //[Timestamp] 
    [ConcurrencyCheck] 
    public int Versao { get; set; } 
} 

public class Perfil 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Nome { get; set; } 

    [StringLength(100)] 
    public string Descricao { get; set; } 

    //[Timestamp] 
    [ConcurrencyCheck] 
    public int Versao { get; set; } 

    public virtual ICollection<Usuario> Usuarios { get; set; } 
    public virtual ICollection<Permissao> Permissoes { get; set; } 
} 

public class Permissao 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Nome { get; set; } 

    [StringLength(100)] 
    public string Descricao { get; set; } 

    //[Timestamp] 
    [ConcurrencyCheck] 
    public int Versao { get; set; } 

    public virtual ICollection<Perfil> Perfis { get; set; } 
} 

Add-Migration Acesso द्वारा उत्पन्न कोड (केवल Up() विधि):

public partial class Acesso : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.Usuario", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        NomeCompleto = c.String(nullable: false, storeType: "mediumtext"), 
        Email = c.String(nullable: false, storeType: "mediumtext"), 
        Login = c.String(nullable: false, storeType: "mediumtext"), 
        Senha = c.String(nullable: false, storeType: "mediumtext"), 
        Ativo = c.Boolean(nullable: false), 
        Versao = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "dbo.Perfil", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Nome = c.String(nullable: false, storeType: "mediumtext"), 
        Descricao = c.String(storeType: "mediumtext"), 
        Versao = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "dbo.Permissao", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Nome = c.String(nullable: false, storeType: "mediumtext"), 
        Descricao = c.String(storeType: "mediumtext"), 
        Versao = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "dbo.PerfilPermissao", 
      c => new 
       { 
        PerfilId = c.Int(nullable: false), 
        PermissaoId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => new { t.PerfilId, t.PermissaoId }) 
      .ForeignKey("dbo.Perfil", t => t.PerfilId, cascadeDelete: true) 
      .ForeignKey("dbo.Permissao", t => t.PermissaoId, cascadeDelete: true) 
      .Index(t => t.PerfilId) 
      .Index(t => t.PermissaoId); 

     CreateTable(
      "dbo.UsuarioPerfil", 
      c => new 
       { 
        UsuarioId = c.Int(nullable: false), 
        PerfilId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => new { t.UsuarioId, t.PerfilId }) 
      .ForeignKey("dbo.Usuario", t => t.UsuarioId, cascadeDelete: true) 
      .ForeignKey("dbo.Perfil", t => t.PerfilId, cascadeDelete: true) 
      .Index(t => t.UsuarioId) 
      .Index(t => t.PerfilId); 

    } 
} 

सबसे पहले मैं क्योंकि एक त्रुटि बदलने से पहले हुई (नहीं किया गया प्रकार rowversion के बारे में कुछ

[Timestamp] 
public byte[] Versao { get; set; } 

से

[ConcurrencyCheck] 
public int Versao { get; set; } 

को Versao (संस्करण) का नाम गुण बदलना पड़ा नामस्थान या उपनाम के साथ योग्य)। इस बदलाव के बाद मैं प्रवास उत्पन्न करने में सक्षम था, लेकिन Update-Database आदेश कंसोल में दिखाया गया है निम्नलिखित त्रुटि के साथ विफल: (। इनपुट स्ट्रिंग एक सही स्वरूप में नहीं में नहीं था)

System.FormatException: Cadeia de entrada não estava em um formato incorreto. 
    em System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 

मैंने कोशिश की MySQL संस्करण 5.5 और 5.1 का उपयोग करने के लिए; कनेक्टर के संस्करण 6.5.4, 6.4.5 और 6.3.9 और समस्या को हल नहीं कर सका।

क्या MySQL, इकाई फ्रेमवर्क और कोड का पहला दृष्टिकोण उपयोग करना संभव है? यदि नहीं, तो .NET एक के बजाय ओडीबीसी कनेक्टर पर स्विच करने के क्या परिणाम हैं?

अग्रिम धन्यवाद और बड़े प्रश्न के बारे में खेद है।

+0

स्टैक ट्रेस क्या है? मुझे आश्चर्य है कि यह यह नहीं है: http://entityframework.codeplex.com/workitem/461 – Pawel

उत्तर

3

आपको .NET Connector 6.6 भी आजमाएं क्योंकि यह पहली रिलीज है जो ईएफ 4.3 (माइग्रेशन के साथ पहली रिलीज) के लिए समर्थन का दावा करती है। यदि यह मदद नहीं करता है तो यह पता लगाने के लिए कि क्या समस्या .NET कनेक्टर में है या ईएफ में है, आपको dotConnect for MySql (कम से कम परीक्षण) का प्रयास करना चाहिए। ओडीबीसी कनेक्टर ईएफ के साथ काम नहीं करेगा।

+0

धन्यवाद! लगभग वहां ... दुर्भाग्यवश .NET कनेक्टर 6.6 EntityFramework.dll संस्करण = 4.3.1.0 पर निर्भर करता है लेकिन इकाई फ्रेमवर्क 5.0 डीएलएल का संस्करण 4.4.0.0 है। एक सिस्टम। Reflection.TargetInvocationException तब होता है जब मैं नए कनेक्टर का उपयोग करके माइग्रेशन चलाने की कोशिश करता हूं: System.IO.FileLoadException: नया फॉई possível carregar arquivo ou assembly 'EntityFramework, संस्करण = 4.3.1.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089' ou uma डी suas dependências। एक definição do manifesto विधानसभा स्थानीयकरण não corresponde à referência विधानसभा करते हैं। (Exceção de HRESULT: 0x80131040) –

+0

मैंने ईएफ को संस्करण 4.3.1 में घटा दिया और यह काम किया! :) –

1

मुझे नहीं लगता कि कोड माइग्रेशन .NET कनेक्टर 6.6 द्वारा समर्थित है। मैंने इसे पहले से ही कोशिश की है, जब आप 'अपडेट-डाटाबेस' चलाते हैं तो त्रुटि प्राप्त होगी प्रदाता 'MySql.Data.MySqlClient' के लिए कोई माइग्रेशन स्क्लजेनरेटर नहीं मिला। अतिरिक्त SQL जेनरेटर पंजीकृत करने के लिए लक्ष्य माइग्रेशन कॉन्फ़िगरेशन क्लास में SetSqlGenerator विधि का उपयोग करें। MySQL के लिए dotConnect काम कर सकता है क्योंकि वे कहते हैं कि उन्होंने माइग्रेशन समर्थन

+0

एक MySQLMigrationSqlGenerator MySql.Data.Entity पैकेज में मौजूद है। आपको SetMigrationSqlGenerator() का उपयोग करके इसे मैन्युअल रूप से पंजीकृत करना होगा। आपको संकलन करने की भी आवश्यकता है।.NET Framework 4.5 के विरुद्ध नेट कनेक्टर 6.6 या आप अनुभव करेंगे कि गणित.एएमएम –

0

ईएफ सीटीपी 5 (उर्फ संस्करण 4.4.0) का उपयोग करने वाली चीज़ यह है कि बनाई गई विधि को बहिष्कृत किया गया है (जो डीबी में संबंधित तालिका बनाने के लिए उपयोग किया जाता था) और कनेक्टर/नेट 6.6 उस तालिका को माइग्रेट करने का प्रयास कर रहा है जो अपवाद का कारण बनता है।

18

मेरे पास MySQL डेटा कनेक्टर v.6.6.4 का created a fork है जो एंटीटी फ्रेमवर्क (v.5) के नवीनतम संस्करण का समर्थन करता है।

इसका उपयोग करने के लिए, आप केवल download the binaries कर सकते हैं, जो MySql.Data और MySql.Data.Entity के लिए प्रतिस्थापन असेंबली हैं। यह भी सुनिश्चित करें कि आपकी परियोजना 4.3 के बजाय ईएफ 5 पर निर्भर है।

आप पहली बार Enable-Migrations के बाद, अपने Configuration वर्ग 'निर्माता लाइन शामिल करने के लिए संशोधित:

SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); 

इस बिंदु पर, आप मुद्दों के बिना Add-Migration और Update-Database चलाने के लिए सक्षम होना चाहिए।

  • बाइनरी EF5 बजाय EF4.3 पर निर्भर हैं: इस प्रकार

    मेरी कांटा के प्रमुख परिवर्तन होते हैं।

  • ईएफ 5 आपके सभी टेबल नामों के लिए dbo. तैयार करता है, जो MySQL संभाल नहीं सकता है। इस प्रकार, मेरा संस्करण तालिका नाम से dbo. उपसर्ग को बाहर निकालने के लिए SQL माइग्रेशन जनरेटर को हैक करता है। यह सब मानते हैं कि आप इकाई वर्गों पर TableAttribute के माध्यम से स्कीमा को ओवरराइड नहीं कर रहे हैं।

  • यह CreatedOn के उपयोग को हटा देता है क्योंकि जिमी ने अपने उत्तर में उल्लेख किया था।

+0

से ऊपर था जो आपके कांटा के लिए धन्यवाद। यह मुझे चल रहा है। आपको .NET/कनेक्टर स्रोत कोड को कांटा में कहाँ मिला? मैं इसे किसी अन्य समस्या (यूनिकोड समर्थन) को ठीक करने के लिए खोजने का प्रयास कर रहा हूं। – sergiopereira

+1

@sergiopereira, यह [ज़िप संग्रह] (http://dev.mysql.com/downloads/mirror.php?id=412150) के साथ आता है। –

+0

किर्क, लेकिन आप इसे कहाँ से प्राप्त किया? अभी के लिए मैंने बस आपको बिटबकेट पर रेपो किया है, लेकिन यह जानना अच्छा होगा कि मूल स्रोत कहां है यदि मुझे इसके नए संस्करण पर फिर से फोर्क करने की आवश्यकता है। – sergiopereira

2

कुछ उपयोगी एफई + कनेक्टर/नेट + EFMigrations उपयोग के बारे में गाइड करने के लिए कैसे .. मुझे लगता है कि अगर आप उन्हें जाँच यह मदद मिलेगी रहे हैं। कनेक्टर/नेट (6.6.4) का नवीनतम संस्करण ईएफ 4.3.1 पर निर्भर करता है ईएफ 5 का समर्थन करने वाला कनेक्टर/नेट संस्करण अभी भी कोड चरण में है।

HowTo using EF Migrations and Connector/Net

Upgrading to Code Based Migrations EF 4.3.1 with Connector/Net 6.6

आशा इस मदद करता है!

0

मैं नीचे उल्लेख त्रुटि

नहीं MigrationSqlGenerator प्रदाता 'MySql.Data.MySqlClient' के लिए मिला हो रही थी। अतिरिक्त SQL जेनरेटर पंजीकृत करने के लिए लक्ष्य माइग्रेशन कॉन्फ़िगरेशन क्लास में SetSqlGenerator विधि का उपयोग करें।

और इस बयान

SetSqlGenerator("MySql.Data.MySqlClient", new ySql.Data.Entity.MySqlMigrationSqlGenerator()); 

टी enter image description here अपनी जरूरतों के साथ तय हो गया विन्यास निर्माता के तहत स्थापित किया जाना।

संबंधित मुद्दे