none
Комплесный первичный ключ RRS feed

  • Вопрос

  • Доброго дня. Подскажите пожалуйста как правильно создать первичный ключ из нескольких полей. Вроде как в книге EF4.1 Expert Coocbook написано все просто, н оне выходит.

    имеем

      
       class LineConfiguration : EntityTypeConfiguration<Line>
        {
            public LineConfiguration()
            {
                this.ToTable("Lines");
                this.HasKey(s => new { s.ID, s.Name });
                this.Property(s => s.ID).IsRequired().HasColumnOrder(0).HasColumnName("ID");
                this.Property(s => s.Name).IsRequired().HasColumnOrder(1).HasColumnName("Name").HasMaxLength(15).HasColumnType("Text");
                this.Property(s => s.Description).IsOptional().HasMaxLength(200).HasColumnType("Text");
            }
        }
    	
       public class Line
        {
            public int ID { get; set; }              // ID линии - первичный ключ   
            
            public string Name { get; set; }         // имя линии - первичный ключ
            
            public LineType Type { get; set; }       // тип линии 
           
            public string Description { get; set; }  // описание
    
            public virtual ICollection<RtValues> Values { get; set; }
           
            public virtual ICollection<Errors> Errors { get; set; }
        }

    но никак. При попытке заполнить таблицу выкидывает ошибку

    System.Data.Entity.ModelConfiguration.ModelValidationException не обработано
      HResult=-2146233088
      Message=One or more validation errors were detected during model generation:

    \tSystem.Data.Entity.Edm.EdmAssociationConstraint: : The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical.
    \

    Подскажите пожалуйста, где искать. Может дело в том, чт оя пытаюсь работать внешними ключами в других таблицах, завязанных только на ID данной таблицы?

    Спасибо.


    27 сентября 2012 г. 11:47

Ответы

  • Вот пример составного ключа.

    namespace Test
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new Initializer());
          MyDbContext db = new MyDbContext();
          db.Lines.Add(new Line(){ ID = 1, Name = "Test"});
          db.SaveChanges();
        }
      }
      public class Line
      {
        public int ID { get; set; }              // ID линии - первичный ключ   
        public string Name { get; set; }         // имя линии - первичный ключ
        //public LineType Type { get; set; }       // тип линии 
        //public string Description { get; set; }  // описание
        //public virtual ICollection<RtValues> Values { get; set; }
        //public virtual ICollection<Errors> Errors { get; set; }
      }
    
      public class MyDbContext : DbContext
      {
        public DbSet<Line> Lines { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Entity<Line>().HasKey(l => new { l.ID, l.Name });
        }
      }
      public class Initializer : IDatabaseInitializer<MyDbContext>
      {
    
        #region IDatabaseInitializer<MyDbContext> Members
    
        public void InitializeDatabase(MyDbContext context)
        {
          bool dbExist = context.Database.Exists();
          if (!dbExist)
          {
            context.Database.Create();
            context.SaveChanges();
          }
          else
            return;
        }
    
        #endregion
      }
    }

    Модифицировать думаю не составит труда. Будут вопросы пишите.

    • Предложено в качестве ответа YatajgaModerator 29 сентября 2012 г. 6:02
    • Помечено в качестве ответа Little_Cat_2003 2 октября 2012 г. 5:26
    28 сентября 2012 г. 7:28
    Модератор

Все ответы

  • Покажите обе сущности, суда по ошибке у Вас есть таблица зависящая от этой.
    27 сентября 2012 г. 13:35
    Модератор
  • Спасибо за ваше внимание. Наверное точнее будет показать их конфигурациия.

       class RTValuesConfiguration : EntityTypeConfiguration<RtValues>
        {
            public RTValuesConfiguration()
            {
                this.ToTable("RtValues");
                this.HasKey(s => s.ID);
                this.Property(s => s.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                this.Property(s => s.LineID).IsRequired();
                this.Property(s => s.DateTime).HasColumnType("datetime2").HasPrecision(0);
                this.HasRequired(s => s.Line).WithMany(g => g.Values).HasForeignKey(g => g.LineID).WillCascadeOnDelete();
            }
        }
    
        class ErrorsConfiguration : EntityTypeConfiguration<Errors>
        {
            public ErrorsConfiguration()
            {
                this.ToTable("Errors");
                this.HasKey(s => s.ID);
                this.Property(s => s.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
                this.Property(s => s.LineID).IsRequired();
                this.Property(s => s.DateTime).HasColumnType("datetime2").HasPrecision(0);
                this.HasRequired(s => s.Line).WithMany(g => g.Errors).HasForeignKey(g => g.LineID).WillCascadeOnDelete();
            }
        }	

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

    Может составной первичный ключ и не самая лучшая идея. Подскажите, как добавить контроль уникальности значения на требуемое поле Line типа string в первой таблице тогда. Спасибо большое.


    28 сентября 2012 г. 5:34
  • Вот пример составного ключа.

    namespace Test
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new Initializer());
          MyDbContext db = new MyDbContext();
          db.Lines.Add(new Line(){ ID = 1, Name = "Test"});
          db.SaveChanges();
        }
      }
      public class Line
      {
        public int ID { get; set; }              // ID линии - первичный ключ   
        public string Name { get; set; }         // имя линии - первичный ключ
        //public LineType Type { get; set; }       // тип линии 
        //public string Description { get; set; }  // описание
        //public virtual ICollection<RtValues> Values { get; set; }
        //public virtual ICollection<Errors> Errors { get; set; }
      }
    
      public class MyDbContext : DbContext
      {
        public DbSet<Line> Lines { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Entity<Line>().HasKey(l => new { l.ID, l.Name });
        }
      }
      public class Initializer : IDatabaseInitializer<MyDbContext>
      {
    
        #region IDatabaseInitializer<MyDbContext> Members
    
        public void InitializeDatabase(MyDbContext context)
        {
          bool dbExist = context.Database.Exists();
          if (!dbExist)
          {
            context.Database.Create();
            context.SaveChanges();
          }
          else
            return;
        }
    
        #endregion
      }
    }

    Модифицировать думаю не составит труда. Будут вопросы пишите.

    • Предложено в качестве ответа YatajgaModerator 29 сентября 2012 г. 6:02
    • Помечено в качестве ответа Little_Cat_2003 2 октября 2012 г. 5:26
    28 сентября 2012 г. 7:28
    Модератор
  • Привет.

    Пожалуйста, не бросайте топик без ответа. Если чье-либо сообщение решает проблему, пометьте его как ответ (кнопка под сообщением). Если вы нашил решение сами - то будет очень полезным, если опубликуете его.

    Спасибо.


    Для связи [mail]

    1 октября 2012 г. 7:12
  • Прошу прощения, был тут немного занят. Спасибо огромное за ваше внимание. Попробую адаптировать. Спасибо за ответ.

    2 октября 2012 г. 5:26