Ответ 1
Проблема заключалась в моем свойстве оболочки:
[NotMapped]
public XElement XmlValueWrapper
{
get { return XElement.Parse(XmlValue); }
set { XmlValue = value.ToString(); }
}
Я не указал атрибут NotMapped.
Я хотел бы использовать тип SQL Server xml как тип столбца для класса сущности.
В соответствии с этот поток можно сопоставить такой столбец с типом string:
public class XmlEntity
{
public int Id { get; set; }
[Column(TypeName="xml")]
public string XmlValue { get; set; }
}
В этом определении таблица корректно создается в дате базы. Новые объекты XmlEntity также могут быть созданы.
Но потом я пытаюсь получить некоторую сущность из базы данных:
var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault();
Произошла ошибка:
Одна или несколько ошибок проверки были обнаружены во время генерации моделиSystem.Data.Edm.EdmEntityType: EntityType "XElement" не имеет ключа. Определите ключ для этого EntityType.
Проблема заключалась в моем свойстве оболочки:
[NotMapped]
public XElement XmlValueWrapper
{
get { return XElement.Parse(XmlValue); }
set { XmlValue = value.ToString(); }
}
Я не указал атрибут NotMapped.
Просто чтобы быть полным. Здесь нужен весь код в одной части.
[Column(TypeName = "xml")]
public String XmlContent { get; set; }
[NotMapped]
public XElement InitializedXmlContent
{
get { return XElement.Parse(XmlContent); }
set { XmlContent = value.ToString(); }
}
Как вы это делаете в Data Annotations, если вы хотите использовать Fluent API (и использовать класс сопоставления), то:
public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity>
{
public FilterMap()
{
// ...
this.Property(c => c.XmlContent).HasColumnType("xml");
this.Ignore(c => c.XmlValueWrapper);
}
}
Если вы используете Fluent API, переопределив OnModelCreating на DbContext, просто измените эти "this" на modelBuilder.Entity <XmlEntity> ()