Есть ли в Entity Framework 4 Code First поддержка генераторов идентификаторов, таких как NHibernate? - PullRequest
11 голосов
/ 11 марта 2011

Этот вопрос, заданный год назад, похож на: Поддерживает ли Entity Framework 4 генераторы для значений идентификаторов, таких как NHibernate?

Но что я хотел бы знать, так это то, что код CTP сначала добавляет поддержку стратегий генерации идентификаторов. Если нет, знает ли кто-нибудь хорошую точку расширения в EF для реализации чего-либо подобного?

В настоящее время я работаю с классами моделей, которые используют GUID в качестве идентификатора. При вставке с использованием EF они сохраняют свои Guid.Empty начальные значения. Я знаю, что вы можете установить значение по умолчанию для столбца в БД на newid(), но это противоречит цели создания идентификаторов на стороне клиента.

Является ли Entity Framework недостаточно развитым для использования в распределенной, отключенной системе?

Ответы [ 3 ]

16 голосов
/ 11 марта 2011

Нет, Entity Framework Code-First по-прежнему является просто хорошей оболочкой для EFv4.Там нет NHibernate, как генераторы.Если вам нужен генератор идентификаторов на стороне клиента, вам придется переопределить SaveChanges в производном DbContext и реализовать собственную логику назначения идентификаторов новым сущностям.

Редактировать:

Пример высокого уровня:

public class Context : DbContext
{
    // Helper for example
    // DO NOT USE IN REAL SCENARIOS!!!
    private static int i = 0; 

    public DbSet<MyEntity> MyEntities { get; private set; }

    public Context()
        : base("connection")
    {
        MyEntities = Set<MyEntity>();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<MyEntity>().HasKey(e => e.Id);
        // Turn off autogeneration in database
        modelBuilder.Entity<MyEntity>()
                    .Property(e => e.Id)
                    .HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None);

        // Other mapping
    }

    public override int SaveChanges()
    {
        foreach (var entry in ChangeTracker.Entries<MyEntity>()
            .Where(e => e.State == EntityState.Added))
        {
            // Here you have to add some logic to generate Id
            // I'm using just static field
            entry.Entity.Id = ++i;  
        }

        return base.SaveChanges();
    }
}

public class MyEntity
{
    public int Id { get; set; }
    // Other properties
}
6 голосов
/ 13 сентября 2011

номер

Mine Entity Framework 4.1.10715, установленный NuGet. может быть, вы могли бы использовать атрибут

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;set;}

см. (Полный список аннотаций, поддерживаемых в EF 4.1: CTRL + F на странице) здесь .

0 голосов
/ 19 января 2012
[Key]
public string Id { get; set; }

и затем используйте новый GUID ToString

Units.Add( new Unit(){Id=Guid.NewGuid().ToString(), Name="123"});
...