2013-01-09 73 views
1

編輯:完整的源代碼現已在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查詢。

+0

房產,你說的是,有一個特殊的名字 - 「索引」。 –

+0

你使用什麼版本的EF? –

+0

我正在使用實體框架5 – Moeri

回答

0

完整的源代碼。

https://bitbucket.org/moerie/multilanguagestring

由於這MultilingualString事實上是一個屬性,我試圖解決我的問題只需將我的MultilingualString映射到一個字符串屬性。然後我可以告訴實體框架完全不映射我的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解決方案來解決我原來的問題,但是這個解決方法非常好。

1

您是否有權編輯MultilingualString?嘗試添加註釋[NotMapped],就會向給你的麻煩財產的頂部

+1

是的,我自己寫的。 [NotMapped]屬性起作用(但坦率地說,我已經知道;-)),但是這個類是在我的域項目中定義的,我想保持持久性不可知。 這就是爲什麼我特意要求Fluent Api的解決方案:-)感謝您的建議! – Moeri

相關問題