2011-10-07 7 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)"); 
    } 
} 

에 대한 일대일 관계, this address에서 씨 Manavi의 블로그 시리즈를 참조하십시오.
업데이트 : 당신이 Period에서 Account에 대한 참조를 갖고 싶어
는 귀하의 의견을 바탕으로, 당신은 당신의 계정의 기본 키에 ForeignKey 속성을 넣을 수 있습니다.

좋은 샘플 this address에 위치한 그래도 기간에서 계정 내 참조를 잃은이 솔루션을

+0

(제목 부분 "제로에 하나 하나 개의 관계를지도"). –

+0

@ 닉 올슨 : 내 대답이 업데이트되었습니다. – Kamyar

관련 문제