实体框架与MySql:地图系统.引导到VARCHAR(40)

本文关键字:VARCHAR 系统 框架 MySql 地图 实体 | 更新日期: 2023-09-27 18:05:07

我首先使用实体框架6代码连接到MySql数据库。我不拥有这个数据库。I 不能修改数据库模式。我也不能更改为另一种风格的实体框架(首先是模型或数据库)。

在将POCO对象映射到特定表

时遇到问题

表如下:

CREATE TABLE 'my_table' (
   'id' VARCHAR(40) NOT NULL,
   'name' VARCHAR(200),
   Primary Key ('id')
)

我知道'id'列将永远是一个Guid。因此,我创建了POCO类,如下所示:

public class MyTable
{
   public Guid Id { get; set;}
   public string Name { get; set;}
}

根据我的理解,EF for MySql只会将VARCHAR列映射到POCO中的字符串字段。是否有任何方法我可以告诉实体框架,"id"列应该从VARCHAR(40)转换为Guid?

我正在考虑接受我不能映射到Guid的事实。我只需映射到一个字符串并创建一个自定义getter方法:

public class MyTable
{
   public string Id { get; set;}
   public string Name { get; set;}
   public Guid GetId()
   {
       Guid id;
       if (Guid.TryParse(this.Id, out id))
            return id;
       else
            return new Guid();
   }
} 

请帮助一个EF新手。由于

实体框架与MySql:地图系统.引导到VARCHAR(40)

我找不到这样做的方法。我希望实体框架会抛出一个异常,如果VARCHAR(40)不能被解析为Guid。MySQL提供程序不是这样的。

我最终将Id成员声明为字符串。为了使我的POCO类成为一个真正的POCO类,我创建了一个助手方法来将字符串转换为guid。

你可能想要使用interface,并使用显式实现。

public interface IMyTable
{
  Guid Id { get; set; }
  string Name { get; set; }
}
public class MyTable : IMyTable
{
  public string Id { get; set; }
  public string Name { get; set; }
  // use explicit implementation for Id
  Guid IMyTable.Id
  {
    get => Guid.Parse(this.Id);
    set => this.Id = value.ToString();
  }
}

因此,您可以使用IMyTable来获取具有预期类型的字段的对象,而不是使用MyTable。