Entity Framework: запись пользовательских аннотаций данных для изменения CASE значений - PullRequest
2 голосов
/ 01 июня 2011
class DemoUser
{
    [TitleCase]
    public string FirstName { get; set; }

    [TitleCase]
    public string LastName { get; set; }

    [UpperCase]
    public string Salutation { get; set; }

    [LowerCase]
    public string Email { get; set; }
}

Предположим, у меня есть демо-класс, как написано выше, я хочу создать некоторые пользовательские аннотации, такие как LowerCase, UpperCase и т. Д., Чтобы его значение автоматически конвертировалось.Это позволит мне использовать эти аннотации и в других классах.

Ответы [ 2 ]

3 голосов
/ 29 февраля 2012

Как и предполагал Ладислав, это два вопроса в одном.

Предполагая, что вы следуете рецепту для создания атрибутов в ссылке Jefim, и если вы вызываете эти созданные классы атрибутов "UpperCaseAttribute", "LowerCaseAttribute" и "TitleCaseAttribute", следующее переопределение SaveChanges () должно работать в EF 4.3 ( текущая версия на момент публикации этого ответа).

public override int SaveChanges()
{
    IEnumerable<DbEntityEntry> changedEntities = ChangeTracker.Entries().Where(e => e.State == System.Data.EntityState.Added || e.State == System.Data.EntityState.Modified);

    TextInfo textInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
    changedEntities.ToList().ForEach(entry =>
    {
        var properties = from attributedProperty in entry.Entity.GetType().GetProperties()
                        where attributedProperty.PropertyType == typeof (string)
                        select new { entry, attributedProperty,
                                    attributes = attributedProperty.GetCustomAttributes(true)
                                        .Where(attribute => attribute is UpperCaseAttribute || attribute is LowerCaseAttribute || attribute is TitleCaseAttribute) 
                                };
        properties = properties.Where(p => p.attributes.Count() > 1);

        properties.ToList().ForEach(p =>
        {
            p.attributes.ToList().ForEach(att =>
            {
                if (att is UpperCaseAttribute)
                {
                    p.entry.CurrentValues[p.attributedProperty.Name] = textInfo.ToUpper(((string)p.entry.CurrentValues[p.attributedProperty.Name]));
                }
                if (att is LowerCaseAttribute)
                {
                    p.entry.CurrentValues[p.attributedProperty.Name] = textInfo.ToLower(((string)p.entry.CurrentValues[p.attributedProperty.Name]));
                }
                if (att is TitleCaseAttribute)
                {
                    p.entry.CurrentValues[p.attributedProperty.Name] = textInfo.ToTitleCase(((string)p.entry.CurrentValues[p.attributedProperty.Name]));
                }
            });
        });
    });
    return base.SaveChanges();
}
0 голосов
/ 01 июня 2011

Вы можете переопределить метод SaveChanges в своем контексте EF (если вы используете генерацию кода по умолчанию, просто напишите частичный класс).Примерно так:

public partial class MyEntityContext
{
    public override int SaveChanges(SaveOptions options)
    {
        IEnumerable<ObjectStateEntry> changedEntities = 
            this.ObjectStateManager.GetObjectStateEntries(
                System.Data.EntityState.Added | System.Data.EntityState.Modified);
        // here you can loop over your added/changed entities and 
        // process the custom attributes that you have
        return base.SaveChanges(options);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...