Свободное владение NHibernte Изменениями / Соглашениями
-
03-07-2019 - |
Вопрос
Мне нравится схема, которую я увидел в этом посте в блоге (http://marekblotny.blogspot.com/2009/04/conventions-after-rewrite.html), где автор проверяет, было ли уже внесено изменение имени таблицы, прежде чем применять соглашение.
public bool Accept(IClassMap target)
{
//apply this convention if table wasn't specified with WithTable(..) method
return string.IsNullOrEmpty(target.TableName);
}
Условный интерфейс, который я использую для длины строки, - это iProperty:
public class DefaultStringLengthConvention: IPropertyConvention
{
public bool Accept(IProperty property) {
//apply if the string length hasn't been already been specified
return ??; <------ ??
}
public void Apply(IProperty property) {
property.WithLengthOf(50);
}
}
Я не вижу, где iProperty предоставляет что-либо, что сообщает мне, было ли свойство уже установлено.Возможно ли это?
ТИА, Беррил
Решение 3
Чтобы пояснить в коде, о чем говорят Стюарт и Джейми, вот что работает:
public class UserMap : IAutoMappingOverride<User>
{
public void Override(AutoMap<User> mapping) {
...
const int emailStringLength = 30;
mapping.Map(x => x.Email)
.WithLengthOf(emailStringLength) // actually set it
.SetAttribute("length", emailStringLength.ToString()); // flag it is set
...
}
}
public class DefaultStringLengthConvention: IPropertyConvention
{
public bool Accept(IProperty property) {
return true;
}
public void Apply(IProperty property) {
// only for strings
if (!property.PropertyType.Equals(typeof(string))) return;
// only if not already set
if (property.HasAttribute("length")) return;
property.WithLengthOf(50);
}
}
Другие советы
.WithLengthOf()
добавляет "изменение" (Action<XmlElement>
) к списку изменений, которые необходимо применить при создании XML-сопоставления.К сожалению, это поле является private
и нет свойства для доступа к списку изменений, поэтому я боюсь, что (в настоящее время) нет способа проверить, была ли у карты свойств WithLengthOf
применительно к нему.
До тех пор, пока не появится лучшая альтернатива, вы можете использовать HasAttribute("length")
.