2017-08-04 72 views
0

我與EF代碼第一次嘗試,並創建實體Article在子類EF代碼第一次實體列

public class Article 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid ArticleId { get; set; } 

    [Required, MaxLength(50)] 
    public string Title { get; set; } 

    public DateTimeRange Published { get; set; } 
} 

因爲會有許多實體需要一個範圍,我認爲這將是更容易地創建一類DateTimeRange

public class DateTimeRange 
{ 
    [Required] 
    public DateTime From { get; set; } 

    public DateTime? To { get; set; } 
} 

代碼生成工作得很好,這是結果:

CreateTable(
    "dbo.Articles", 
    c => new 
     { 
      ArticleId = c.Guid(nullable: false, identity: true), 
      Title = c.String(nullable: false, maxLength: 50), 
      Published_From = c.DateTime(nullable: false), 
      Published_To = c.DateTime(), 
     }) 
    .PrimaryKey(t => t.ArticleId); 

但是,我想要生成沒有下劃線的列名。我試着給列FromTo特定名稱:

[Required, Column("PublishedFrom")] 
public DateTime From { get; set; } 

[Column("PublishedTo")] 
public DateTime? To { get; set; } 

這完美的作品:

PublishedFrom = c.DateTime(nullable: false), 
PublishedTo = c.DateTime() 

事情是:就像我說的,我想在幾個實體,也許用這個甚至在同一實體中多次出現,因此在DateTimeRange中給出一個固定名稱將不起作用。我寧願只是說能連接沒有下劃線的名字。 有沒有辦法做到這一點?

UPDATE
這就是我目前的解決方案,我從鏈接的幫助下通過virusstorm

[ComplexType] 
public class DateTimeRange 
{ 
    [Required] 
    public DateTime From { get; set; } 

    public DateTime? To { get; set; } 
} 

,然後提供了,在的DbContext類:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Types<Article>().Configure(config => config.Property(article => article.Published.From).HasColumnName("PublishedFrom")); 
    modelBuilder.Types<Article>().Configure(config => config.Property(article => article.Published.To).HasColumnName("PublishedTo")); 
} 
+0

看看代碼優先的自定義約定。 –

回答

1

你需要使DateTimeRange成爲具有屬性的實體框架中的複雜類型。然後,您需要在OnModelCreating方法中添加設置詳細信息。看看Making Complex Types Useful with Entity Framework 6 Custom Configurations。這應該讓你走上正確的道路。

+0

謝謝,這似乎工作。但是,通過這種解決方案,每次使用這些解決方案時,我都必須爲這兩個字段設置一個約定。有沒有辦法使這個通用?我嘗試使用modelBuilder.Types()。Configure()而不是modelBuilder.Types

().Configure(),但無法讓它工作。 –

+1

有通過接口和反射來實現這一點的方法。我通常不會推薦它,但反射確實會降低性能。由於實體框架的設計方式,沒有一種好方法可以使這種真正的通用或抽象。您始終可以爲其製作一個案例並將其推薦爲一項功能。 https://data.uservoice.com/forums/72025-entity-framework-core-feature-suggestions – virusstorm

+0

請在鏈接中添加代碼的相關部分。如果鏈路斷開,這個答案是無用的。 –