Уникальное ограничение с EFCodeFirst и SqlCe4 - PullRequest
6 голосов
/ 18 июля 2011

Я пишу приложение ASP.net MVC3 с использованием Entity Framework Code First и SqlCe4.

Я разработал несколько моделей и нашел одну, которая оказывается интересной.Это то, что у меня пока есть:

public class Preference
    {
        public int PreferenceId { get; set; }

        [Required]
        public int StudentId { get; set; }
        public virtual Student Student { get; set; }

        [Required]
        public int PresentationId { get; set; }
        public virtual Presentation Presentation { get; set; }

        [Required]
        public int Rank { get; set; }
    }

Мне, однако, нужны уникальные ограничения или индексы, потому что для конкретного учащегося я хочу, чтобы у него был список предпочтений, но PresentationId долженбыть уникальным для каждого студента.Есть ли способ сделать это с помощью Code First или некоторого атрибута проверки?

Звучит так, как будто я иду вниз по ветви отношения многие ко многим с объектом Preference в качестве посредника, чтобы добавить свойство Rank,Тем не менее, я не могу найти, как убедиться, что значения являются уникальными.Действительно ли лучший способ вручную просто добавить уникальный индекс в базу данных вне EF?

Ответы [ 4 ]

3 голосов
/ 18 июля 2011

В настоящее время (т.е. EF 4.1) EF не имеет Attribute или механизма конфигурации для создания уникальных индексов.

Однако, если вы используете Database Initializer, вы можете создать его вручную

public class MyInitializer : IDatabaseInitializer<MyContext>
{
    public void InitializeDatabase(MyContext context)
    {
        if (!context.Database.Exists() || !context.Database.ModelMatchesDatabase())
        {
            context.Database.DeleteIfExists();
            context.Database.Create();

            context.ObjectContext.ExecuteStoreCommand("CREATE INDEX IX_Preference_PresentationId ON Preference ( PresentationId )");
        }
    }
}

Или выполнить его вне Инициализатора.

1 голос
/ 07 июня 2013

Я не уверен, как долго эта функция существует, но в EF5 вы можете использовать методы CreateIndex и DropIndex в ваших методах Up () и Down (). Это позволяет вам создавать уникальные индексы, которые практически идентичны уникальным ограничениям, на собственном языке EF.

public partial class UniqueIndexMigration
{
    public override void Up()
    {
        // Create new unique index
        this.CreateIndex("dbo.TableName", new[] { "Col1", "Col2", "Col3" }, true, "IX_TableName_Col1_Col2_Col3");
    }

    public override void Down()
    {
        // Drop unique index
        this.DropIndex("dbo.TableName", "IX_TableName_Col1_Col2_Col3");
    }
}

Значение true, замеченное выше, является параметром, который указывает, что это уникальное ограничение. К сожалению, эти ограничения не соблюдаются при последующих миграциях (EF не отбросит их для вас, если вы измените базовую схему), но я надеюсь, что с помощью EF API ваш код получит обновление бесплатно, когда эта функция наконец добавлена.

0 голосов
/ 13 мая 2012

См. Ответ, который реализует ограничение Уникальность с пользовательским атрибутом валидации: https://stackoverflow.com/a/10566485/1133338

0 голосов
/ 18 июля 2011

Исходя из того, что говорил Eranga, я в итоге заставил его работать аналогично, но так:

Я использовал следующий код в своем классе DataContext:

public class StudentRegistrationContext : DbContext
{
    public StudentRegistrationContext()
    {
        Database.SetInitializer(new StudentRegistrationDatabaseInitializer());
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Teacher> Teachers { get; set; }
    public DbSet<Presenter> Presenters { get; set; }
    public DbSet<Presentation> Presentations { get; set; }
}

В базе данныхКласс инициализатора, я использовал следующее:

public class StudentRegistrationDatabaseInitializer : DropCreateDatabaseIfModelChanges<StudentRegistrationContext>
{
    protected override void Seed(StudentRegistrationContext context)
    {
        base.Seed(context);
        context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX UX_Preferences_StudentId_PresentationId ON Preferences (StudentId, PresentationId)");
    }
}
...