CodeFirst EF4.1 MVC против устаревшей базы данных - конфликты множественности - PullRequest
53 голосов
/ 04 ноября 2011

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

При генерации модели обнаружена одна или несколько ошибок проверки:

System.Data.Edm.EdmAssociationType:: Множественность конфликтует с референтным ограничением в роли Venue_Courses_Source во взаимосвязи Venue_Courses.Поскольку все свойства в зависимой роли не имеют значения NULL, кратность основной роли должна быть равна 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

}

Ответы [ 4 ]

140 голосов
/ 09 ноября 2011

Надеюсь, это еще вовремя, чтобы помочь вам.У меня также была точно такая же проблема, и я почти целый час мучился с ней, пока не обнаружил свою ошибку.

Проблема в том, что отношение Course.Venue является необязательным (как заявлено в свободном API), нообъявление Id Course.VenueId является обязательным, поэтому вы можете сделать VenueId необязательным, изменив его на

public int? VenueId { get; set;}

или изменив отношение на обязательное для свободного API, и OnModelCreating должен работать нормально после изменениячто.

4 голосов
/ 26 января 2012

После поиска в Интернете

System.Data.Edm.EdmAssociationType:: множественность конфликтует со ссылочным ограничением в роли

Он продолжал связываться с этим постом, так что вот моя проблемаРешение:

Я обновил большой проект с ef4.0 до ef4.1 с использованием расширения для обратного инжиниринга vs ef.Наше приложение mvc использовало метаданные и партиалы для украшения объектов ef4.0.

После удаления файлов метадатипа проект начал работать.

Проблема с корнем была атрибутом [Обязательный] как ef pocoобъект имел значение nullable, и мой метаданный имел [Обязательный] для того же свойства.Раньше было необходимо применять правила проверки mvc, а теперь ef4.1 использовался для заполнения свойств навигации.Удаление [Обязательный] из метаданного типа решило проблему.

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; }
}
2 голосов
/ 17 января 2014

Убедитесь, что вы не используете HasKey () в сочетании с HasOptional () в ваших сопоставлениях. Это было причиной этой ошибки в моем случае.

2 голосов
/ 01 октября 2012

Я боролся с этой ошибкой в ​​моем проекте инфраструктуры объектов, я решил эту проблему, изменив нулевое значение VenueId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...