Игнорировать это свойство [] в Code First Fluent Api? Добавлен столбец "Товар"

Изменить: полный исходный код теперь доступен по адресу https://bitbucket.org/moerie/multilanguagestring

Я реализовал класс MultilingualString, который может сериализовать словарь в XML и сохранять в базе данных.

(См. Источник здесь: https://gist.github.com/4491990)

Это на самом деле реализация IDictionary, но я на самом деле не добавляю это к своему классу, так как это, похоже, приводит к сбоям в Entity Framework.

использование этого класса выглядит следующим образом:

Предположим, что класс 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

Как вы можете видеть, Entity Framework добавляет свойство с именем "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 с этим классом).

2 ответа

Решение

Полный исходный код:

https://bitbucket.org/moerie/multilanguagestring

Поскольку этот MultilingualString на самом деле является свойством, я попытался решить свою проблему, просто сопоставив свой MultilingualString со свойством String. Тогда я мог бы просто сказать Entity Framework, чтобы он не отображал мое свойство 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-решения для моей первоначальной проблемы, но этот обходной путь оказался отличным.

У вас есть доступ для редактирования MultilingualString? Попробуйте добавить аннотацию [NotMapped] поверх свойства, из-за которого возникают проблемы.

Другие вопросы по тегам