C# EF编码子类中的第一个实体列

C# EF编码子类中的第一个实体列,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我首先尝试EF代码,并创建了实体文章: 由于将有许多实体需要一个范围,我认为创建类DateTimeRange会更容易: 代码生成工作得很好,结果如下: 但是,我希望生成的列名不带下划线。我尝试为列指定了具体的名称: 这一点非常有效: 事情是这样的:就像我说的,我想在几个实体中使用它,甚至可能在同一个实体中使用多次,所以在DateTimeRange中指定一个固定的名称是行不通的。我更愿意只说连接名称而不使用下划线。 有办法吗 更新 这是我目前的解决方案,我从VirusTorm提供的链接中

我首先尝试EF代码,并创建了实体文章:

由于将有许多实体需要一个范围,我认为创建类DateTimeRange会更容易:

代码生成工作得很好,结果如下:

但是,我希望生成的列名不带下划线。我尝试为列指定了具体的名称:

这一点非常有效:

事情是这样的:就像我说的,我想在几个实体中使用它,甚至可能在同一个实体中使用多次,所以在DateTimeRange中指定一个固定的名称是行不通的。我更愿意只说连接名称而不使用下划线。 有办法吗

更新 这是我目前的解决方案,我从VirusTorm提供的链接中得到了帮助

然后,在DBContext类中:


您需要使DateTimeRange成为实体框架中具有属性的复杂类型。然后,您需要在OnModelCreating方法中添加安装详细信息。看一看。这将使您走上正确的道路。

请看代码优先的自定义约定。谢谢,这似乎很有效。但是,使用此解决方案,每次使用这两个字段时,我都必须为它们设置约定。有没有办法让这个通用?我尝试使用modelBuilder.Types.Configure而不是modelBuilder.Types.Configure,但无法使其正常工作。可以通过接口和反射实现这一点。但我通常不推荐它,因为反射确实会带来性能代价。由于实体框架的设计方式,没有一种好方法可以使其真正通用或抽象。你总是可以为它辩护,并将其作为一项功能推荐。请在链接中添加代码的相关部分。如果链接断开,这个答案是无用的。我已经根据@virustorm评论中的链接内容,用当前的解决方案更新了我的问题
public class Article
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ArticleId { get; set; }

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

    public DateTimeRange Published { get; set; }
}
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);
[Required, Column("PublishedFrom")]
public DateTime From { get; set; }

[Column("PublishedTo")]
public DateTime? To { get; set; }
PublishedFrom = c.DateTime(nullable: false),
PublishedTo = c.DateTime()
[ComplexType]
public class DateTimeRange
{
    [Required]
    public DateTime From { get; set; }

    public DateTime? To { get; set; }
}
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"));
}