2012-12-18 1 views
0

Мне не удается получить отношения один к одному с EF для правильной работы. Я забил блоги, SO и msdn docs, но я ничего не работаю.делают обе модели осведомлены друг о друге с отношением «один к одному» в инфраструктуре сущности asp.net.

У меня есть две модели, класс и экзамен, который выглядеть следующим образом:

[Table("classes")] 
public class Class 
{ 

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

    [StringLength(255), Required] 
    public string Title { get; set; } 

    public virtual Exam Exam { get; set; } 
} 


[Table("exams")] 
public class Exam 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [DisplayFormat(DataFormatString = "{0:h:mm tt}")] 
    public DateTime? Time { get; set; } 

    public int ClassId { get; set; } 
    public virtual Class Class { get; set; } 
} 

Я хочу, чтобы иметь возможность получить доступ к экзамен из класса и класса от экзамена, но независимо от того, что Я делаю, я нахожу ошибку.

Попытка создания/запуска миграции Я получаю следующее.

The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

Если добавить это в моем контексте:

protected override void OnModelCreating(DbModelBuilder builder) 
{ 
    builder.Entity<Exam>() 
     .HasRequired(e => e.Class) 
     .WithOptional(c => c.Exam); 
} 

Я получаю следующее сообщение об ошибке:

System.Data.Entity.Infrastructure.DbUpdateException: Entities in 'BenchContext.Exams' participate in the 'Class_Exam' relationship. 0 related 'Class_Exam_Source' were found. 1 'Class_Exam_Source' is expected. ---> System.Data.UpdateException: Entities in 'BenchContext.Exams' participate in the 'Class_Exam' relationship. 0 related 'Class_Exam_Source' were found. 1 'Class_Exam_Source' is expected. 

Я не знаю, как сказать свободно апи, как правильно иностранные ключ между двумя моделями, и ничто из этого не влияет.

Что мне не хватает?

ответ

1

Вы пытаетесь построить взаимно-однозначное отношение через ClassId недвижимость в Exam класс. Для этого требуется, чтобы ClassId был уникальным (= уникальное ограничение), но уникальное ограничение еще не поддерживается EF.

Единственный способ EF в настоящее время поддерживает реальное отношение один к одному является разделение первичного ключа:

[Table("classes")] 
public class Class 
{ 

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

    [StringLength(255), Required] 
    public string Title { get; set; } 

    public virtual Exam Exam { get; set; } 
} 


[Table("exams")] 
public class Exam 
{ 
    [Key, ForeignKey("Class")] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 

    [DisplayFormat(DataFormatString = "{0:h:mm tt}")] 
    public DateTime? Time { get; set; } 

    public virtual Class Class { get; set; } 
} 

Id в Exams таблицы как PK и FK для Classes таблицы. Он не может иметь автогенерированную стоимость. Хотя это взаимно однозначное отношение, оно все еще имеет 1 - 0..1 кратность (Class может существовать без Exam, но Exam должно иметь Class).

+0

Спасибо за ответ. Когда я это сделаю, я получаю следующую ошибку. «Искаженное свойство в ссылочной привязке сопоставляется с столбцом, созданным магазином. Столбец:« Идентификатор ». – kayluhb

+0

Вы изменили 'DatabaseGeneratedOption' на' None'? –

+0

Да, это была проблема. Я действительно с EF добавила бы поддержку. Этот подход имеет смысл, но не ведет себя как любой другой ORM, который я когда-либо использовал, в и вне .net. еще раз спасибо. – kayluhb