2014-12-05 116 views
1

我从NuGet安装ShortGuid并希望将它用作我的表的关键。我想将22个字符的字符串存储在数据库中而不是Guid中,因此在调试时更容易找到记录。我如何让Entity Framework创建此列?ShortGuid与实体框架

我尝试添加:

public ShortGuid NewCol { get; set; } 

但没有加入列。我试过了:

[Column(TypeName = "nvarchar")] 
[MaxLength(22), MinLength(22), StringLength(22)] 
public ShortGuid NewCol { get; set; } 

但是还是没有列。据推测,英孚不理解我在做什么,只是忽略了专栏?

public Guid NewCol { get; set; } 

我想我可以只使用一个22字符的字符串列,但最好我想用ShortGuid类型:如果我只是用的Guid它工作正常。那可能吗?

+0

这看起来相当偏离/“哈克”,所以你可以体验到更好的调试体验。这听起来像你需要改进你的调试过程/工具。 – 2014-12-05 23:18:06

+0

为什么不在EF中使用GUID,只是在检索它们时将它们转换为NewGuid的? – 2014-12-06 05:55:34

+0

@TheMuffinMan在发生错误时,您从未发现在挖掘数据库时使用Guid会很痛苦吗?不知道你是如何建议改进调试方法...但它也使得更短和更漂亮的网址。 – Sean 2014-12-06 05:56:22

回答

0

我都经历过,在过去与实体框架类似的东西。据我所知,列的类型不能是一个复杂的类型。这是实体框架的限制(但我对此不是100%确定)。

我会分享我通常在这种情况下所做的事情,即使我知道我的答案更多的是解决问题的办法而不是正确的答案。

我在我的课程中创建了两个属性:1)将作为数据库中的列的属性和2)我最初打算保留在我的课程中的属性。下面的代码片段将解释我正在尝试做什么。

Event.cs:

namespace MyContext.Model 
{ 
    public partial class Event 
    { 
     [Key] 
     public int EventId { get; set; } 

     public string AccessTokenStr { get; set; } 

     // [NotMapped] tells Entity Framework to not make a column for the following property 
     [NotMapped] 
     public ShortGuid AccessToken 
     { 
      get 
      { 
       return new ShortGuid(AccessTokenStr); 
      } 

      set 
      { 
       AccessTokenStr = value.ToString(); 
      } 
     } 
    } 
} 

希望这有助于。

+0

这可能是一个很好的解决方案。谢谢。 – Sean 2015-01-07 12:02:10

0

地图它作为一个复杂的类型,但你不能用它作为主键

+0

我会研究复杂的类型,但是如果我不能用它作为主键,它就会失败。 – Sean 2014-12-06 06:01:49