2011-03-17 3 views
9

방금 ​​새로운 Entity Framework 4.1 NuGet 패키지를 설치 했으므로 NuGet 소개 this article of Scott Hanselman에 따라 EFCodeFirst 패키지를 대체했습니다.EF 4.1 어수선한 것들. FK 명명 전략이 변경 되었습니까?

이제 다음과 같은 모델을 상상 :

public class User 
{ 
    [Key] 
    public string UserName { get; set; } 
    // whatever 
} 

public class UserThing 
{ 
    public int ID { get; set; } 
    public virtual User User { get; set; } 
    // whatever 
} 

마지막 EFCodeFirst 릴리스

UserThing 테이블의 외부 키를 생성 UserUserName을했다.

새 릴리스를 설치하고 난 다음 오류 얻을 실행 한 후 :

Invalid column name 'User_UserName' 

물론 새 릴리스가 다른 FK 네이밍 전략을 가지고 있다는 것을 의미한다. 이것은 다른 모든 테이블과 컬럼 사이에서 일치합니다. AnyOldForeignKeyID EF 4.1이라는 FK EFCodeFirst가 AnyOldForeignKey_ID (밑줄에 유의하십시오)을 호출하기를 원합니다.

FK에 밑줄을 붙여도 상관 없지만,이 경우 불필요하게 데이터베이스를 버리고 재 작성하거나 불필요하게 al FK를 이름을 바꾸어야한다는 의미입니다.

FK 명명 규칙이 변경된 이유와 Fluent API를 사용하지 않고 을 구성 할 수 있는지 여부를 알고있는 사람이 있습니까??

답변

3

불행하게도,이 릴리스로하지 않은 것들 중 하나는 코드 첫 번째 사용자 지정 규칙을 추가 할 수있는 기능은 다음과 같습니다

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx

당신은 유창하게 API를 사용하지 않으려면 열 이름을 구성하려면 (나는 당신을 비난하지 않는다), 가장 직접적인 방법은 아마 sp_rename을 사용하고있을 것이다.

+0

덕분에, 나는 동정 ... 너무 그 기사를 건너 왔어요 , 그러나 그것은 왜 처음부터 바뀌 었습니까? –

+1

문제점을 해결하는 방법에 대한 제안을 포함하도록 답변을 업데이트했지만, 그다지 간단하지는 않습니다. 나는 왜 대회가 바뀌 었는지 모르겠다. 얼리 어답터의 단점 중 하나입니다. 이런 식으로 당신을 바꿀 수 있습니다. 내 개인 사이트에서 사용하는 것처럼 나에게도 영향을 미친다. 더 나쁜 것은 내 자신의 두 가지 규칙을 작성한 것이므로 지금은 실제로 크릭이다. –

+0

sp_rename을 사용하여 현재 FK의 이름을 새 국제 대회에서 기대하는 이름으로 변경 하시겠습니까? 고마워, 고마워! –

3

왜 다음을 수행하지 않습니까?

public class User 
    { 
    [Key] 
    public string UserName { get; set; } 
    // whatever 
    } 

    public class UserThing 
    { 
    public int ID { get; set; } 
    public string UserUserName { get; set; } 
    [ForeignKey("UserUserName")] 
    public virtual User User { get; set; } 
    // whatever 
    } 

또는, UserThing에 UserUserName 속성을 추가하지 않으려면, 다음, 유창한 API를 사용하므로 같은 :

// class User same as in question 
// class UserThing same as in question 

public class MyContext : DbContext 
{ 
    public MyContext() 
    : base("MyCeDb") { } 
    public DbSet<User> Users { get; set; } 
    public DbSet<UserThing> UserThings { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    modelBuilder.Entity<UserThing>() 
     .HasOptional(ut => ut.User) // See if HasRequired fits your model better 
     .WithMany().Map(u => u.MapKey("UserUserName")); 
    } 
} 
+0

@Andre -'[ForeignKey]'속성을 이미 시도했지만 오류가 발생했습니다. 어느 쪽이 좋을까요? '나는 정말로 내 코드를 수수께끼로 삼고 싶지 않기 때문에. 그리고 구체적으로 유창한 API *를 사용하지 않는 솔루션을 요구합니다.) –

+0

@Sergi : 시도했을 때 어떤 오류가 있었는지 모르겠지만 제공 한 모델에 대해 두 가지 구현을 모두 테스트했으며 두 가지 모두 정상적으로 작동합니다. 당신은 당신을 위해 적합한 대답을 가지고 있습니다, 나는 단지 내장 된 컨벤션과 다른 이름의 외래 키 컬럼을 어떻게 사용할 수 있는지에 대한 두 가지 옵션을 추가하기를 원했습니다. –

+0

@ 앙드레 - 감사합니다. –

관련 문제