2013-10-27 44 views
0

這是我的POCO實體框架的遷移:爲什麼字符串屬性忽略IsRequired「

public class Game 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Galaxy> Galaxies { get; set; } 
} 

這裏的TypeConfiguration ....

public class GameConfiguration : EntityTypeConfiguration<Game> 
{ 
    public GameConfiguration() 
    { 
     HasKey(x => x.Id); 
     Property(x => x.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity); 

     HasMany(x => x.Galaxies); 

     Property(x => x.Name) 
      .IsRequired() 
      .HasMaxLength(50); 
    } 
} 

我的問題是這樣的......爲什麼,當這是遷移代碼沒有將「Name」屬性設置爲「NOT NULL」?它也會忽略MaxLength設置。爲什麼會這樣?

CreateTable(
    "dbo.Games", 
    c => new 
    { 
     Id = c.Guid(nullable: false), 
     Name = c.String(), 
    }) 
    .PrimaryKey(t => t.Id); 
+1

這可能太明顯了,但是您確定實體配置正在模型構建器中註冊?乍一看,即使配置構造函數從未運行,以及名稱屬性是否缺失以解釋它,您的配置的其餘部分也會與約定發生的情況匹配。 – divega

+0

現在我覺得真的很愚蠢。你是正確的,實體配置沒有被註冊在上下文的構造函數中。你可以發佈這個答案,我可以給你信用嗎? – Hades

+0

好的。不要覺得愚蠢! :)很高興它幫助。 – divega

回答

1

乍一看,即使配置構造函數從未運行過,配置的其餘部分也會按照約定發生,即使配置構造函數從未運行過,以及名稱屬性是否缺失以解釋它。在模型構建器中註冊配置的代碼缺失。

您可以註冊實體配置,例如在這樣的OnModelCreated方法中:

modelBuilder.Configurations.Add(new GameConfiguration());