开发者

how do i create a composite key that comprises a foreign key with code first?

I am using EF4 code first and want to generate a composite key which is made of a class property and foreign key. I have two classes: Order and Company. The Order class holds a reference but this will not necessarily be unique between companies. So I intend to use a composite key made up of Reference and Company.CompanyId.

I have tried using the following to set it but I get an error message "Key expression is not valid".

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId });

I have also tried

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company });

and this fails.

these are my classes:

public class Order
{
   public string Reference { get; set; }
   public Company Company { get开发者_运维技巧; set; }
}

public class Company
{
   public int CompanyId { get; set; }
   public virtual ICollection Orders { get; set; }
}

Any help would be greatly appreciated.


As Antony Highsky mentioned, you can only use scalar properties in the key. So, you will need to add a foreign key (scalar property) to the Order class and associate it with the navigation property Company as shown below:

public class Order
{
    public string Reference { get; set; }

    public int CompanyId { get; set; }

    [RelatedTo(ForeignKey = "CompanyId")]
    public Company Company { get; set; }
}

And then create the composite key using the model builder:

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 

Note that data annotations (RelatedTo attribute) were introduced with the Entity Framework CTP 3. For another option that only uses data annotations instead of HasKey method, see this post:

  • http://www.luisrocha.net/2010/11/creating-composite-keys-using-code.html


One thing that doesn't look quite right is your use of the non-generic version of ICollection. Try this:

public virtual ICollection<Order> Orders { get; set; }


Did you try this?

modelBuilder.Entity().HasKey(o =>o.Reference ); modelBuilder.Entity().HasKey(o =>o.CompanyId );


According to this source, only scalar properties are allowed in the key. Navigation properties are not.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜