【问题标题】:Object Relational Mapping (ORM) between MySQL database and c# objects in Visual Studio using LINQ使用 LINQ 在 Visual Studio 中 MySQL 数据库和 c# 对象之间的对象关系映射 (ORM)
【发布时间】:2019-11-03 05:46:29
【问题描述】:

我正在尝试在 MySQL 数据库和 Visual Studio 中的 c# 对象之间建立 ORM

我已安装以下软件包以将 MySQL 数据库添加到数据源列表:

遵循这篇文章中的建议:How to connect to a MySQL Data Source in Visual Studio

我已经创建了数据源,我的代码看起来像这样......

app.config 中的连接字符串:

  <connectionStrings>
    <add name="MyMapper.Properties.Settings.myConnectionString" connectionString="server=my-db-instance.xxxxxxxxxxxx.eu-west-1.rds.amazonaws.com;user id=my_user_id;password=my_user_password;persistsecurityinfo=True;database=my_database" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>

MyDataContext.cs 中的数据上下文:

namespace MyMapper
{
   [Database]
   public class MyDataContext : DataContext
   {
      public MyDataContext() : base(Properties.Settings.Default.myConnectionString) { }
      public Table<ElementId> ElementIds;
   }
}

ElementId.cs 中的映射类:

namespace MyMapper
{
   [Table(Name = "ElementId")]
   public class ElementId
   {
      [Column(Name = "IntegerValue", IsPrimaryKey = true)]
      public int IntegerValue { get; set; }
   }
}

在 MyController.cs 中插入操作:

ElementId my_element_id = new ElementId();
my_element_id.IntegerValue(88);

using (MyDataContext my_data_context = new MyDataContext())
{
   my_data_context.ElementIds.InsertOnSubmit(my_element_id);
   my_data_context.SubmitChanges();
}

执行 SubmitChanges() 时抛出以下异常:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server

看来问题出在与数据库的连接上

更新回答Why am I getting "Cannot Connect to Server - A network-related or instance-specific error"? 中提出的解决方案:我不是在尝试连接到 SqlConnection 而是连接到 MySqlConnection

【问题讨论】:

标签: c# mysql .net entity-framework


【解决方案1】:

数据上下文连接不是 MySqlConnection

namespace MyMapper
{
   [Database]
   public class MyDataContext : DataContext
   {
      public MyDataContext() : base(new MySqlConnection(Properties.Settings.Default.myConnectionString)) { }
      public Table<ElementId> ElementIds;
   }
}

但现在抛出以下异常:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '[ElementId]([IntegerValue])
VALUES (88)' at line 1

看起来查询没有被格式化为 MySQL

更新: MySQL 支持需要 NuGet 包:

我用过 MySQL.Data 和 Entity Framework 6 (EF6):https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html

选择 EF6 的原因是因为 EF Core 在撰写此答案时确实支持 Type Per Type (https://entityframework.net/tpt) (https://github.com/aspnet/EntityFrameworkCore/issues/2266)

MyDataContext.cs 中的数据上下文:

namespace MyMapper
{
   [DbConfigurationType(typeof(MySqlEFConfiguration))]
   public class MyDataContext : DbContext
   {
      public DbSet<BaseClass> BaseClass{ get; set; }
      public DbSet<ElementId> ElementId { get; set; }

      public MyDataContext () : base(new MySqlConnection(Properties.Settings.Default.myConnectionString).ConnectionString) { }

      protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
      {
         dbModelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); // to avoid pluralization of the tables

         // EntityTypeConfiguration<T>
         dbModelBuilder.Configurations.Add(new BaseClassConfiguration());
         dbModelBuilder.Configurations.Add(new ElementIdConfiguration());

      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2011-04-15
    • 1970-01-01
    • 2013-05-27
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多