Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Code First CTP4: Table with no primary key?

With Entity Framework and Code First, is it possible to let it create and use a table with no primary keys? I can't get this setup to work:

public class Report
{
    public virtual int ReportId
    public virtual ICollection<ReportChanges> ReportChanges
}

public class ReportChanges
{
    public virtual Report Report
    public virtual string EditorName
    public virtual DateTime Changed
}

Note that I've excluded assigning a primary key in ReportChanges. But with this setup I get: "Unable to infer a key for entity type 'ReportChanges'".

Either I'm missing something, or Code First doesn't support tables with no primary keys. What is correct? Thanks.

like image 702
Buginator Avatar asked Apr 08 '26 01:04

Buginator


2 Answers

EF needs a way to keep track of its own internal changes. Here's a code sample to help others who've Googled this:

public class YourDataContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ReportChanges>().HasKey(x => new {x.Report, x.Changed});
    }
}

The "new {x.Report, x.Changed}" creates a fake composite key allowing EF to uniquely point to a row internally.

like image 191
Rap Avatar answered Apr 10 '26 16:04

Rap


The EF can support a table with no PI if there is still a way to uniquely identify a row, but it can't infer the unique identifier without a proper PK. In other words, lie to the EF and say that there is a PK, say, on Report and Changed.

like image 28
Craig Stuntz Avatar answered Apr 10 '26 14:04

Craig Stuntz