使用MySql的实体框架:将System.Guid映射到VARCHAR(40)

时间:2016-08-31 21:05:42

标签: c# mysql entity-framework ef-code-first entity-framework-6

我首先使用Entity Framework 6代码连接到MySql数据库。我不拥有数据库。我无法更改数据库架构。我也无法改变到Entity Framework的另一种风格(模型或数据库优先)。

我无法将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新手。感谢

2 个答案:

答案 0 :(得分:0)

我找不到办法做到这一点。如果VARCHAR(40)无法解析为Guid,我希望实体框架只会抛出异常。 MySQL提供商的情况并非如此。

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

答案 1 :(得分:0)

您可能希望使用接口并使用显式实现。

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。