編輯:完整的源代碼現已在https://bitbucket.org/moerie/multilanguagestring使用Code First Fluent API忽略此[]屬性?列「項目」添加
,我實現了一個名爲MultilingualString類可序列化字典XML和保存到數據庫中。
(見這裏來源:https://gist.github.com/4491990)
這實際上是IDictionary中的一個實現,但我真的不添加到我的班,因爲它似乎導致了實體框架打嗝。
使用這個類是像如下:
假設一類產品的定義是這樣的:
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和我創建EntityTypeConfiguration的Xml值:
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
正如你所看到的,實體框架添加一個名爲「項」財產,我懷疑這是因爲下列財產在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這個屬性。
我該如何忽略此屬性?提前致謝。
P.S.對於那些對MultilingualString類感興趣的人,請注意,您將需要LinqKit庫(特別是AsExpandable()和Compile()函數來執行此類的Linq查詢。
房產,你說的是,有一個特殊的名字 - 「索引」。 –
你使用什麼版本的EF? –
我正在使用實體框架5 – Moeri