Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unique constraint with EFCodeFirst and SqlCe4

I'm writing an ASP.net MVC3 application using Entity Framework Code First and SqlCe4.

I have been designing several models, and found one that is turning out to be interesting. This is what I have so far:

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; }
    }

I however, need a unique constraint or index, because for a particular student, I want them to have to have a list of preferences, but the PresentationId needs to be unique for each student. Is there a way to do this via Code First or some validation attribute?

This sounds like I'm going down the branch of a many to many relationship with the Preference object being an intermediary, to add the Rank property. However, I can't seem to find how to make sure that the values are unique. Is the best way really to manually just add a unique index to the database outside of EF?

like image 925
mandreko Avatar asked Jul 18 '11 00:07

mandreko


1 Answers

Currently(ie EF 4.1) EF does not have an Attribute or configuration mechanism to create unique indexes.

However if you are using Database Initializer you can create it manually

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 )");
        }
    }
}

Or execute it outside the Initializer.

like image 161
Eranga Avatar answered Nov 15 '22 06:11

Eranga