none
EF Связи сущностей по ID RRS feed

  • Вопрос

  • Добрый день, буду признателен за помощь с вопросом по EF CF.

    Имеется следующая сущность

    public class Task {... public Guid EmployeeID { get; set; } public virtual Employee Employee { get; set; } public Guid EmployeeOwnerID { get; set; } public virtual Employee EmployeeOwner { get; set; } ...}

    Делаю, вроде бы все как по учебнику и в моем понимании задав значение для свойства EmployeeID - Employee должна "подтянутся" из бд.

    Но, на деле не так. При выполнение 

    Task MyTask.Employee = context.Employee.single(e=>e.FIO=="Иванов") //условный пример

    ORM создает под сущность Employee, столбец Employee_EmployeeID для хранения Guid'а cущность,

    а для EmployeeOwner - EmployeeOwner_EmployeeID.

    Почему так происходит и почему ей не нравятся  свойства созданные мной заранее под Guid'ы?

    Пытался, переименовать свойства для Idшников, в соответствие тем, что создает ORM, но на выходе получаю вновь созданные, но уже

    Employee_EmployeeID1 и EmployeeOwner_EmployeeID1 соответственно.

    Благодарю за содействие.

    p.s

    Сущность Employee

    public class Employee
    {
    ...
    public virtual ICollection<Task> Task { get; set; } 
    public virtual ICollection<Task> TaskOwner { get; set; }
    ...
    }

    27 августа 2012 г. 19:02

Ответы

  • Вот так должно работать.

    namespace TestCf
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new Initializer());
          MyDbContext db = new MyDbContext();
          Employee emp = new Employee { EmployeeID = new Guid() };
          db.Employees.Add(emp);
          db.Tasks.Add(new Task() { TaskId = 5, EmployeeID=emp.EmployeeID, EmployeeOwnerID= emp.EmployeeID });
          db.SaveChanges();
        }
      }
      public class Task
      {
        public int TaskId { get; set; }
    
        public Guid EmployeeID { get; set; }
        public virtual Employee Employee { get; set; }
    
        public Guid EmployeeOwnerID { get; set; }
        public virtual Employee EmployeeOwner { get; set; }
      }
      public class Employee
      {
        public Guid EmployeeID { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        public virtual ICollection<Task> TaskOwner { get; set; }
      }
      public class MyDbContext : DbContext
      {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Employee> Employees { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Entity<Task>().HasRequired(t => t.Employee)
            .WithMany(e => e.Tasks)
            .HasForeignKey(t => t.EmployeeID).WillCascadeOnDelete(false);
          modelBuilder.Entity<Task>().HasRequired(t => t.EmployeeOwner)
            .WithMany(e => e.TaskOwner)
            .HasForeignKey(t => t.EmployeeOwnerID).WillCascadeOnDelete(false);
          base.OnModelCreating(modelBuilder);
        }
      }
      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 1 сентября 2012 г. 5:18
    • Помечено в качестве ответа Abolmasov Dmitry 5 сентября 2012 г. 12:52
    29 августа 2012 г. 19:13
    Модератор

Все ответы

  • А какая структура БД Вам нужна, покажите схему и отношения?
    27 августа 2012 г. 19:07
    Модератор
  • По идеи все просто

    сущность Task по мимо прочих свойств содержит два свойства для хранения информации о том, кто создал задачу и о том, кому она была создана.

    Эта связь отражена в кусках кода выше.

     Вот, что сгенерировала ORM

    27 августа 2012 г. 19:22
  • Я имел ввиду схему которая должна быть, вместо того, что генерируется.
    27 августа 2012 г. 19:48
    Модератор
  • Примерно такую схему, хотелось бы получить
    28 августа 2012 г. 5:56
  • Может, я как-то, не понятно сформулировал вопрос?
    28 августа 2012 г. 14:30
  • Попробуйте к вашим свойствам добавить аннотацию с указанием столбца:

    [Column("НазваниеСтолбца", TypeName="Guid")]


    Для связи [mail]

    28 августа 2012 г. 20:22
  • Да, надо подумать. С виду простая, но на самом деле нет, время нужно, пока его нет.
    28 августа 2012 г. 20:44
    Модератор
  • Вот так должно работать.

    namespace TestCf
    {
      class Program
      {
        static void Main(string[] args)
        {
          Database.SetInitializer(new Initializer());
          MyDbContext db = new MyDbContext();
          Employee emp = new Employee { EmployeeID = new Guid() };
          db.Employees.Add(emp);
          db.Tasks.Add(new Task() { TaskId = 5, EmployeeID=emp.EmployeeID, EmployeeOwnerID= emp.EmployeeID });
          db.SaveChanges();
        }
      }
      public class Task
      {
        public int TaskId { get; set; }
    
        public Guid EmployeeID { get; set; }
        public virtual Employee Employee { get; set; }
    
        public Guid EmployeeOwnerID { get; set; }
        public virtual Employee EmployeeOwner { get; set; }
      }
      public class Employee
      {
        public Guid EmployeeID { get; set; }
        public virtual ICollection<Task> Tasks { get; set; }
        public virtual ICollection<Task> TaskOwner { get; set; }
      }
      public class MyDbContext : DbContext
      {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Employee> Employees { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
          modelBuilder.Entity<Task>().HasRequired(t => t.Employee)
            .WithMany(e => e.Tasks)
            .HasForeignKey(t => t.EmployeeID).WillCascadeOnDelete(false);
          modelBuilder.Entity<Task>().HasRequired(t => t.EmployeeOwner)
            .WithMany(e => e.TaskOwner)
            .HasForeignKey(t => t.EmployeeOwnerID).WillCascadeOnDelete(false);
          base.OnModelCreating(modelBuilder);
        }
      }
      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 1 сентября 2012 г. 5:18
    • Помечено в качестве ответа Abolmasov Dmitry 5 сентября 2012 г. 12:52
    29 августа 2012 г. 19:13
    Модератор
  • Большое спасибо за ответ, не успел пометить ответ как верный так как отсутствовал.

    Yatajga Не поделитесь источник своих знаний в области EF?

    Был бы признателен.

    10 сентября 2012 г. 12:07
  • На русском пока ничего толкового нет, можно для начала это и это. Но дальше только английская литература, насколько знаю пока не перевели. На английском книги Джули Лерман: "Programming Entity Framework: Code First by Julia Lerman and Rowan Miller", "Programming Entity Framework: DbContext by Julia Lerman and Rowan Miller". Их легко можно найти в сети и скачать.

    10 сентября 2012 г. 12:30
    Модератор