2016-09-23 37 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 
    } 

我很茫然,什麼造成了這樣或如何找到如何停止遷移使得這種奇怪的變化 - 任何線索?

更多有趣的信息。

我用奇怪的遷移更新了數據庫,然後發現有一個模型錯誤,應用程序無法運行。我必須從用戶名字段中刪除MaxLength屬性,然後一切正常。

重新添加屬性並擺弄MaxLength不會產生任何新的遷移 - 看起來該屬性被忽略,但只有在該表從這個類繼承的地方。

很明顯,我已經改變了一些事情來做到這一點,但做了一個提交Git,並有一個很好看的文件更改仍然沒有給我任何線索。

+0

又是什麼在'Down'方法產生? –

+0

它將長度限制放回:AlterColumn(「dbo.Organisation」,「UserName」,c => c.String(maxLength:256)); – OzTrak

+0

這絕對是奇怪的,不能用乾淨的測試複製。任何在這裏沒有顯示的特殊代碼 - 比如「OnModelCreating」,基於接口進行通用流暢配置等等。必須有其他的東西導致它。 –

回答

0

MaxLengthAttribute沒有[AttributeUsage (Inherited = True)]註釋,所以它在繼承類中被忽略,就像你所建議的那樣。在這種情況下,你應該重複MaxLength約束用流利的API的幫助下,像這樣的東西:

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