1

编辑:现在可以在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 查询。

4

2 回答 2

1

您有权编辑 MultilingualString 吗?尝试在给您带来麻烦的属性顶部添加注释 [NotMapped]。

于 2013-01-09T12:32:53.120 回答
0

完整源代码:

https://bitbucket.org/moerie/multilanguagestring

由于这个 MultilingualString 实际上是一个属性,我试图通过将 MultilingualString 映射到 String 属性来解决我的问题。然后我可以告诉实体框架不要完全映射我的 MultilingualString 属性。

这是我现在的产品类:

public class Product
{
    private MultilingualString _description;
    private MultilingualString _name;

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    public virtual string DescriptionXml
    {
        get { return Description.Value; }
        set { Description.Value = value; }
    }

    public virtual string NameXml
    {
        get { return Name.Value; }
        set { Name.Value = value; }
    }

    [NotMapped]
    public virtual MultilingualString Description
    {
        get { return _description ?? (_description = new MultilingualString()); }
        set { _description = value; }
    }

    [NotMapped]
    public virtual MultilingualString Name
    {
        get { return _name ?? (_name = new MultilingualString()); }
        set { _name = value; }
    }
}

这也严重简化了我的数据库。

是的,我找不到一个流畅的 API 解决方案来解决我原来的问题,但是这个解决方法非常好。

于 2013-01-11T09:12:05.457 回答