EFCodeFirst和SqlCe4的唯一约束

man*_*eko 6 sql-server ef-code-first asp.net-mvc-3

我正在使用Entity Framework Code First和SqlCe4编写ASP.net MVC3应用程序.

我一直在设计几个模型,并发现一个变得有趣.这是我到目前为止:

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; }
    }
Run Code Online (Sandbox Code Playgroud)

然而,我需要一个独特的约束或索引,因为对于特定的学生,我希望他们必须有一个偏好列表,但PresentationId需要对每个学生都是唯一的.有没有办法通过Code First或一些验证属性来做到这一点?

这听起来像是我将Preference对象作为中间人的多对多关系的分支,以添加Rank属性.但是,我似乎无法找到如何确保值是唯一的.真正的手动只是在EF之外的数据库中添加唯一索引是最好的方法吗?

man*_*eko 0

按照埃兰加所说的,我最终让它以类似的方式工作,但像这样:

我在 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; }
}
Run Code Online (Sandbox Code Playgroud)

在数据库初始化程序类中,我使用了以下内容:

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)");
    }
}
Run Code Online (Sandbox Code Playgroud)