Search code examples
entity-framework-4entity-framework-ctp5

Entity Framework 4 ctp5 one table has two foreign keys to the same table


I Have two tables:

Users and News. Table News has columns id, name, createdby, modifiedby. Table user has columns id and name. Table News references table User by foreign keys createdby and modifiedby. I use Entity Framework 4 ctp5. I tried to access createdby or modifiedby properties, but error appers: Invalid column name "UserId1", Invalid column name "UserId2". Could anybody explain what I am doing wrong?

public class News
{
    // Primitive properties

    public int ID { get; set; }
    public string Name { get; set; }
    public System.Guid UserId { get; set; }
    public System.Guid UserId1 { get; set; }

    // Navigation properties

    public virtual User User { get; set; }
    public virtual User User1 { get; set; }

}

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public partial class SomeEntities : DbContext
{
    public SomeEntities() : base("name=SomeEntities"){ }

    public DbSet<User> Users { get; set; }
    public DbSet<News> News { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<News>().Property(i => i.UserId).HasColumnName("CreatedBy");
        modelBuilder.Entity<News>().Property(i => i.UserId1).HasColumnName("ModifiedBy");
    }
}

Solution

  • The following object model gives you the desired results (I renamed properties just to make it more readable):

    public class News
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Guid CreatedBy { get; set; }
        public Guid ModifiedBy { get; set; }
        public virtual User CreatedByUser { get; set; }
        public virtual User ModifiedByUser { get; set; }
    }
    
    public class User
    {
        public Guid ID { get; set; }
        public string Name { get; set; }
    }
    
    public class Ctp5Context : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<News> News { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<News>()
                        .HasRequired(n => n.CreatedByUser)
                        .WithMany()
                        .HasForeignKey(n => n.CreatedBy);
    
            modelBuilder.Entity<News>()
                        .HasRequired(n => n.ModifiedByUser)
                        .WithMany()
                        .HasForeignKey(n => n.ModifiedBy)
                        .WillCascadeOnDelete(false);                        
        }
    }