Игнорировать это свойство [] в 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] поверх свойства, из-за которого возникают проблемы.