Entity Framework 4.1 Code First Foreign Key Id’s

Entity Framework 4.1 Code First Foreign Key Id’s

I have two entities referenced one to many. When entity framework created the table it creates two foreign keys, one for the key I have specified with the fluent interface and the other for the ICollection. How do I get rid of the duplicate foreign key?
public class Person
{
    public long RecordId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string Username { get; set; }

    public long DepartmentId { get; set; }
    public virtual Department Department { get; set; }
}

public class Department
{
    public long RecordId { get; set; }
    public string Name { get; set; }

    public virtual ICollection People { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .HasRequired(p => p.Department)
        .WithMany()
        .HasForeignKey(p => p.DepartmentId)
        .WillCascadeOnDelete(false);
}

Thanks!

Solutions/Answers:

Answer 1:

You must specify the many-end of the association explicitely:

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany(d => d.People)
    .HasForeignKey(p => p.DepartmentId)
    .WillCascadeOnDelete(false);

Otherwise EF will assume that there are two associations: One which is not exposed in Department with the foreign key DepartmentId and navigation property Department in the Person class as you have defined in the Fluent code – and another association which belongs to the exposed navigation property People but with another not exposed end in Person and a foreign key automatically created by EF. That’s the other key you see in the database.

Answer 2:

The default Code First conventions detect your DepartmentId foreign key, since it is, well, conventional. I think you should remove the Fluent definition:

modelBuilder.Entity<Person>()
    .HasRequired(p => p.Department)
    .WithMany()
    .WillCascadeOnDelete(false);

Answer 3:

best thing is to remove departmentid property from Person class and add the following statement. MapKey will create foreign key column with the name you specify

 modelBuilder.Entity<Person>().HasRequired(p =>  p.Department)
    .WithMany().Map(x=>x.MapKey("DepartmentId"))
    .WillCascadeOnDelete(false);

Our Awesome Tools

References

How do I pass 2 lists into Parallel.ForEach?

How do I pass 2 lists into Parallel.ForEach?

How do I pass 2 lists into Parallel.ForEach?
Example:  
List a = new List() { new Person(), new Person(), new Person() };
List b = new List() { new Car(), new Car(), new Car() };

//PSEUDO CODE
Parallel.ForEach(a, b, (person, car) => {
    //WORK ON person, WORK ON car
});  

I would prefer to avoid encapsulating Person and Car into Object container. Is this possible?

Solutions/Answers:

Answer 1:

If you’re using .NET 4 (which you probably are) and you’re trying to pair the first Person with the first Car etc, you can just use Zip:

List<Person> a = new List<Person>() { new Person(), new Person(), new Person() };
List<Car> b = new List<Car>() {} { new Car(), new Car(), new Car() };
var zipped = a.Zip(b, (person, car) => new { person, car });

Parallel.ForEach(zipped, pair => {
    Person person = pair.person;
    Car car = pair.car;
});

Answer 2:

You are looking for Enumerable.Zip

Our Awesome Tools

References