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

请在链接中添加代码的相关部分。如果链路断开,这个答案是无用的。 –