Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Edit:

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

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
}

Ответ 2

Нет.

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

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

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

Ответ 3

[Key]
public string Id { get; set; }

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

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