编辑:现在可以在https://bitbucket.org/moerie/multilanguagestring获得完整的源代码
我已经实现了一个名为 MultilingualString 的类,它可以将字典序列化为 XML 并保存到数据库中。
(参见此处的来源:https ://gist.github.com/4491990 )
这实际上是 IDictionary 的一个实现,但我实际上并没有将它添加到我的类中,因为它似乎会导致实体框架出现问题。
这个类的用法如下:
假设类 Product 定义如下:
public class Product
{
public int Id { get; set; }
public virtual MultilingualString Description { get; set; }
public virtual MultilingualString Name { get; set; }
}
然后您可以执行以下操作:
// make some products
var product1 = new Product
{
Id = 1,
Name = new MultilingualString(),
Description = new MultilingualString()
};
product1.Name["fr"] = "Produit 1";
product1.Description["fr"] = "Déscription 1";
product1.Name["nl"] = "Produkt 1";
product1.Description["nl"] = "Omschrijving 1";
无论如何,因为我只想要 Id 和 Xml 值,所以我做了一个 EntityTypeConfiguration:
public class MultilingualStringConfiguration: EntityTypeConfiguration<MultilingualString>
{
public MultilingualStringConfiguration()
{
Ignore(m => m.Count);
Ignore(m => m.Keys);
Ignore(m => m.Values);
Ignore(m => m.IsReadOnly);
}
}
当我运行此代码时,将创建 MultilingualStrings 表,如下所示:
CREATE TABLE [dbo].[MultilingualStrings](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Value] [nvarchar](max) NULL,
[Item] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.MultilingualStrings] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
如您所见,实体框架添加了一个名为“Item”的属性,我怀疑这是因为 MultilingualString 中的以下属性:
/// <summary>
/// Gets or sets the element with the specified key.
/// </summary>
/// <returns>
/// The element with the specified key.
/// </returns>
/// <param name="key">The key of the element to get or set.</param><exception cref="T:System.ArgumentNullException"><paramref name="key"/> is null.</exception><exception cref="T:System.Collections.Generic.KeyNotFoundException">The property is retrieved and <paramref name="key"/> is not found.</exception><exception cref="T:System.NotSupportedException">The property is set and the <see cref="T:System.Collections.Generic.IDictionary`2"/> is read-only.</exception>
public string this[string key]
{
get
{
if (ContainsKey(key))
return Translations[key];
return string.Empty;
}
set
{
Translations[key] = value;
UpdateValue();
}
}
这是允许我的 MultilingualString 属性用作字典的属性,但遗憾的是我似乎无法从 EntityTypeConfiguration 访问此属性。
我怎么能忽略这个属性?提前致谢。
PS 对于那些对 MultilingualString 类感兴趣的人,请注意,您将需要 LinqKit 库(特别是 AsExpandable() 和 Compile() 函数来使用此类执行 Linq 查询。