2013-08-14 2 views
1

Я использую EntityFramework - Code First, DBContext с классами POCO.EntityFramework - Обнаружение базы данных Созданные свойства

Во время выполнения, как я могу обнаружить свойство принадлежит полей, генерируемый в базе данных, помеченный как .HasDatabaseGeneratedOption, .IsRowVersion (только для чтения?) И т.д.

я посмотрел на var xxx = Entity.GetType().GetProperty("ID").Get ..., не повез.

public partial class OnMuhasebeContext : DbContext 
{ 

    public bool IsDatabaseGeneratedProperty <?>(...) 
    { 
     // Parameters : 
     // We know all poco classes of course 
     // also parameters can be instance type 
    } 
} 

Update:
пожалуйста, прочтите «базу данных генерируемый», как «поле, значение которого генерируется базой данных» и маркирована в модели, чтобы отразить это. Эти свойства относятся к полям, сгенерированным БД, и помечены как идентификатор и RowVersion с использованием Fluent API.

public class POCOMap : EntityTypeConfiguration<POCO> 
{ 
    public POCOMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.ID); 

     this.Property(t => t.RowVersion) 
      .IsFixedLength() 
      .HasMaxLength(8) 
      .IsRowVersion(); 
    } 
} 

Важный момент: Как получить свойства отмечены в модели или кода первой модели, используя Fluent API или Annotions данных. Базы данных сами по себе не важны, как философия, лежащая в основе Entity Framework.

+0

Эмм, вы говорите, вы используете Code First. Как вы можете создавать свойства базы данных? Или вы имеете в виду, что у вас есть поля, которые требуются базе данных? –

+2

Пожалуйста, ознакомьтесь с разделом обновления. Значение поля RowVersion-Timestamp, заданное базой данных при обновлениях. Значения полей идентификатора автоинкремента задаются базой данных при вставках. – Ayhan

ответ

0

Хорошо, я думаю, что получаю то, чего вы пытаетесь достичь.

К сожалению, вы не можете получить доступ к EntityTypeConfiguration из коробки. Однако есть что-то еще, что вы можете сделать. Вы можете использовать свой собственный Attribute и поместить его на свойства, имеющие значения, генерируемые базой данных.

Пример:

Наш пользовательский атрибут:

[AttributeUsage(AttributeTargets.Property)] 
public class GeneratedByDatabaseAttribute : Attribute 
{ 

} 

Очень простой росо, который использует атрибут:

public class SimplePoco 
{ 
    [GeneratedByDatabase] 
    public int Id { get; set; } 

    [GeneratedByDatabase] 
    public int RowVersion { get; set; } 

    public string Name { get; set; } 
} 

Это где происходит волшебство. Я использую GetPropertyInfo, чтобы получить член от выражения лямбды. Этот метод является, безусловно, неполным, но есть достаточное количество примеров для всех arround stackoverflow. Вкратце: я получаю PropertyInfo для данного свойства и проверяем, имеет ли он наш пользовательский атрибут GeneratedByDatabaseAttribute.

public class MyContext : DbContext 
{ 
    public bool IsDatabaseGeneratedProperty<TSource>(Expression<Func<TSource, object>> propertyExpression) 
    { 
     var property = GetPropertyInfo(propertyExpression); 
     var attribute = property.GetCustomAttribute<GeneratedByDatabaseAttribute>(); 
     return attribute != null; 
    } 

    public PropertyInfo GetPropertyInfo<TSource>(Expression<Func<TSource, object>> propertyLambda) 
    { 
     var member = propertyLambda.Body as MemberExpression; 
     if (member == null) 
     { 
      var ubody = (UnaryExpression)propertyLambda.Body; 
      member = ubody.Operand as MemberExpression; 
     } 
     return member.Member as PropertyInfo; 
    } 
} 

Это, как я тестировал с LINQPad:

void Main() 
{ 
    var context = new MyContext(); 
    var result = context.IsDatabaseGeneratedProperty<SimplePoco>(poco => poco.Id); 
    // result: True 
    Console.WriteLine(result); 

    result = context.IsDatabaseGeneratedProperty<SimplePoco>(poco => poco.Name); 
    // result: False 
    Console.WriteLine(result); 
} 
+0

Абсолютно хорошо действующий код. Большое спасибо. И вы даете замечательное объяснение, я быстро запускаю образец проекта, спасибо вам большое. (система не позволяет мне голосовать сейчас, но я это сделаю) – Ayhan

+0

Отображения на основе FluentApi уже существуют в модели entityframework, и, если возможно, я хочу ее использовать. Могу ли я использовать этот метод для получения информации из модели сущности или класса? Я ищу исходный код сущности, чтобы понять его. – Ayhan

+0

Боюсь, что нет. Использование моего решения по-прежнему является общим решением, которое вы могли бы применить во всем приложении. Sidenote: Вы должны быть в состоянии принять ответ. Entity Frameworks свободно доступны на своем сайте codeplex. –

Смежные вопросы