2016-09-23 1 views
2

VS2015에서 EF6을 사용하고 있으며 지금까지 개발 한 많은 성공적인 마이그레이션이있었습니다. 테이블을 변경하여 외래 키를 지정하고 추가 마이그레이션을 실행했습니다. 나는 거기에 기대했던 변화뿐만 아니라 문자열 필드를 가진 많은 기존 테이블도 수정되고 있다는 것을보고 놀랐다.EF6 코드 첫 번째 추가 마이그레이션으로 비정상적인 마이그레이션이 생성되지만 응용 프로그램이 실행됩니다.

외래 키에 대한 변경 사항을 취소했지만 문자열 필드 변경 사항은 아직 마이그레이션에 포함되어 있습니다. 응용 프로그램이 실행되어 데이터베이스와 모델이 동기화 된 것처럼 보이지만 이상한 마이그레이션이 여전히 존재합니다.

표 다음 인터페이스와 클래스의 모든 기반으로 변경되는 :

public interface IModificationHistory 
{ 
    DateTime? DateModified { get; set; } 
    DateTime? DateCreated { get; set; } 
    string UserName { get; set; } 
} 

public class ModificationHistory : IModificationHistory 
{ 
    [JsonIgnore] 
    [Display(Name = "Date modified")] 
    public DateTime? DateModified { get; set; } 

    [JsonIgnore] 
    [Display(Name = "Date created")] 
    public DateTime? DateCreated { get; set; } 

    [JsonIgnore] 
    [DataType(DataType.Text), MaxLength(256)] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 
} 

예는

public class Organisation : ModificationHistory 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    [DataType(DataType.Text), MaxLength(10)] 
    [Display(Name = "Code")] 
    public string Code { get; set; } 

    [Required] 
    [DataType(DataType.Text), MaxLength(255)] 
    [Display(Name = "Name")] 
    public string Name { get; set; } 
} 

이제 새로운 마이그레이션이 갑자기 문자열 길이를 변경하고자하고 무시한다 MaxLength (256) 특성. 이 상속이 지정된 모든 테이블에서 발생합니다.

은 다음과 같습니다

public override void Up() 
    { 
     //snip 
     AlterColumn("dbo.Organisation", "UserName", c => c.String()); 
     //snip 
    } 

나는 딱하다로 무엇이 발생했습니다 또는 방법을 어떻게 마이그레이션이 이상한 변경을 중지하는 방법 찾기 - 어떤 단서를?

더 흥미로운 정보.

이상한 마이그레이션으로 데이터베이스를 업데이트 한 후 모델 오류가 발생하여 앱이 실행되지 않는 것으로 나타났습니다. Username 필드에서 MaxLength 속성을 제거해야만 OK였습니다.

MaxLength를 사용하여 속성을 다시 추가해도 아무 것도없는 새로운 마이그레이션이 생성되지 않았습니다.이 속성은 무시되지만이 클래스에서 상속 된 테이블에서만 나타납니다.

분명히 내가 이런 일이 일어나도록 변화 시켰지만, Git에게 커밋을하고 변경된 파일을 잘 보면서 여전히 단서를 얻지 못했습니다.

+0

'Down'메소드는 무엇을 생성합니까? –

+0

길이 제한을 다시 설정합니다. AlterColumn ("dbo.Organisation", "UserName", c => c.String (maxLength : 256)); – OzTrak

+0

확실히 이상하고 깨끗한 테스트로 재현 할 수 없습니다. 여기에 표시되지 않은 특수 코드 - 인터페이스를 기반으로 일반적인 유창 구성을 수행하는 'OnModelCreating'등. 다른 원인이 있어야합니다. –

답변

0

MaxLengthAttribute에는 [AttributeUsage (Inherited = True)] 주석이 없으므로 제안한대로 상속 된 클래스에서 무시됩니다. 이 경우 Fluent API를 사용하여 MaxLength 제약 조건을 다음과 같이 반복해야합니다.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Types() 
    .Where(x => typeof(ModificationHistory) != x && typeof(ModificationHistory).IsAssignableFrom(x)) 
    .Configure(x => x.Property("UserName").HasMaxLength(256)); 
} 
+0

고마워, 나는 이것을 시도 할 것이다. 이 데이터베이스가 개발되는 동안 수십 개의 마이그레이션이 이루어지기 시작했습니다. 그래도이 문제가 해결되면 나는 매우 감사 할 것입니다. – OzTrak

관련 문제