2011-10-07 129 views
9

我有以下兩種模式實體框架代碼優先一對一的關係

public class Account 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int CurrentPeriodId { get; set; } 

    [ForeignKey("CurrentPeriodId")] 
    public virtual Period CurrentPeriod { get; set; } 

    public virtual ICollection<Period> Periods { get; set; } 
} 

public class Period 
{ 
    public int Id { get; set; } 
    public int AccountId { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 

    public virtual Account Account { get; set; } 
} 

,我試圖運行下面的查詢:

from p in context.Periods 
where p.AccountId == accountId && 
     p.Id == p.Account.CurrentPeriodId 
select p.StartDate 

我也得到一個SQL異常說「無效列名稱Account_AccountId「。

我知道我可以從賬戶側接近這一點,這樣做

from a in context.Accounts 
where a.Id == id 
select a.CurrentPeriod.StartDate 

但我想知道的關係,如何設置,以獲得其他查詢工作。我錯過了什麼?

回答

8

我認爲你的實現是錯誤的。 AFAIK,您無法在EF中使用此方法定義一對一關係。
查看您生成的數據庫,您的Periods表中定義了Account_Id列。這裏是你必須定義什麼:

public class Account 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int CurrentPeriodId { get; set; } 
    public virtual Period CurrentPeriod { get; set; } 
    public virtual ICollection<Period> Periods { get; set; } 
} 

public class Period 
{ 
    public int Id { get; set; } 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

然後,上下文和初始化:

public class TestContext : DbContext 
{ 
    public DbSet<Account> Accounts { get; set; } 
    public DbSet<Period> Periods { get; set; } 

static TestContext() 
{ 
    Database.SetInitializer(new DbInitializer()); 
} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Account>().HasRequired(a => a.CurrentPeriod).WithMany().HasForeignKey(a => a.CurrentPeriodId); 
    } 
} 

class DbInitializer : DropCreateDatabaseAlways<TestContext> 
{ 
    protected override void Seed(TestContext context) 
    { 
     context.Database.ExecuteSqlCommand("ALTER TABLE Accounts ADD CONSTRAINT uc_Period UNIQUE(CurrentPeriodId)"); 
    } 
} 

更多有關一對一的關係,讀Manavi先生在this address博客系列。
更新
基於您的評論,如果你想從PeriodAccount一個參考,你可以把你的帳戶的主鍵ForeignKey屬性。

一個很好的樣本位於this address(標題爲部分「地圖一到零或一對一的關係」)

+0

有了這個解決方案,我已經失去了我的參考,雖然從週期帳戶。 –

+0

@尼克奧爾森:更新了我的答案。 – Kamyar

相關問題