#c# #asp.net-mvc-3 #entity-framework #ef-code-first
#c# #asp.net-mvc-3 #entity-framework #ef-code-first
Вопрос:
Независимо от того, каким способом я это смешиваю, это дает мне ошибки. У меня такое чувство, что я упускаю что-то очевидное, поскольку я продолжаю получать эти ошибки.
Во время генерации модели была обнаружена одна или несколько ошибок проверки:
System.Data.Edm.EdmAssociationType: : Множественность конфликтует со ссылочным ограничением в роли ‘Venue_Courses_Source’ в отношении ‘Venue_Courses’. Поскольку все свойства в зависимой роли не обнуляются, кратность основной роли должна быть ‘1’.
System.Data.Edm.EdmAssociationEnd: : Множественность недопустима в роли ‘Venue_Courses_Target’ в отношении ‘Venue_Courses’. Поскольку зависимая роль ссылается на ключевые свойства, верхняя граница кратности зависимой роли должна быть равна 1.
Курс может иметь только одно место проведения, места могут использоваться многими курсами
public class Course
{
[Key]
public virtual int Id { get; set; }
public string Title { get; set; }
public DateTime StartDate { get; set; }
public int VenueId { get; set; }
public virtual Venue Venue { get; set; }
}
public class Venue
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Course> Courses { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
#region Courses
//Table Alias
modelBuilder.Entity<Course>().ToTable("DBSCHEMA.TR_COURSES");
//Keys
modelBuilder.Entity<Course>().HasKey(c => c.Id);
//Joins
//Join to Venues
modelBuilder.Entity<Course>().HasOptional(c => c.Venue);
//Fields
modelBuilder.Entity<Course>().Property(c => c.Id).HasColumnName("COURSE_ID");
modelBuilder.Entity<Course>().Property(c => c.Title).HasColumnName("CR_TITLE");
modelBuilder.Entity<Course>().Property(c => c.StartDate).HasColumnName("START_DATE");
modelBuilder.Entity<Course>().Property(c => c.VenueId).HasColumnName("VENUE_ID");
#endregion
#region Venues
//Table Alias
modelBuilder.Entity<Venue>().ToTable("DBSCHEMA.VENUES");
//Keys
modelBuilder.Entity<Venue>().HasKey(v => v.Id);
//Joins
modelBuilder.Entity<Venue>().HasMany(venue => venue.Courses);
//Fields
modelBuilder.Entity<Venue>().Property(v => v.Id).HasColumnName("VENUE_ID");
modelBuilder.Entity<Venue>().Property(v => v.Name).HasColumnName("VENUE_NAME");
#endregion
}
Ответ №1:
Надеюсь, это все еще вовремя, чтобы помочь вам. У меня также была точно такая же проблема, и я беспокоился об этом почти час, пока не смог обнаружить свою ошибку.
Проблема в том, что Course.Venue
отношение является необязательным (как указано в fluent API), но объявление идентификатора Course.VenueId
является обязательным, поэтому вы можете либо сделать venueId необязательным, изменив его на
public int? VenueId { get; set;}
или измените отношение на обязательное в fluent API, и OnModelCreating должен работать нормально, как только вы это изменили.
Комментарии:
1. Большое спасибо, я также рад, что я был не единственным! 😉
2. дох! вы спасли мое здравомыслие там 🙂
3. Просто сэкономил мне много времени. Спасибо!
Ответ №2:
После поиска в Интернете
System.Data.Edm.EdmAssociationType: : Конфликты множественности с ссылочным ограничением в роли
Это продолжало появляться с этим сообщением, так что вот моя проблема и решение:
Я обновил большой проект с ef4.0 до ef4.1, используя расширение обратного проектирования vs ef. Наше приложение mvc использовало metadatatype и partials для оформления объектов ef4.0.
После удаления файлов типа метаданных проект начал работать.
Основной проблемой был атрибут [Required], поскольку объект ef poco имел значение null, а мой metadatatype имел значение [Required] для того же свойства. Ранее это было для обеспечения соблюдения правил проверки mvc, а теперь ef4.1 использовался для заполнения свойств навигации. Удаление [Требуется] из metadatatype устранило проблему.
public partial class AgentAgency
{
public long OID { get; set; }
public long? AgentOID { get; set; }
public long? AgencyOID { get; set; }
public string ReinsuranceYear { get; set; }
public virtual Agency Agency { get; set; }
public virtual Agent Agent { get; set; }
}
public class AgentAgencyMetadata
{
public Int64 OID { get; set; }
[Required]
public Int64 AgentOID { get; set; }
[Required]
public Int64 AgencyOID { get; set; }
}
Ответ №3:
я боролся с этой ошибкой в своем проекте entity framework, я решил проблему, изменив нулевое значение venueId .
Ответ №4:
Убедитесь, что вы не используете hasKey() в сочетании с HasOptional() в своих сопоставлениях. Это вызывало эту ошибку в моем случае.