从Visual Studio数据库项目生成Entity Framework模型

13

我正在使用EF5以Database-First模型。并且使用Visual Studio中的数据库项目来维护应用程序的Sql Server数据库架构。

为了更新EF模型,我将更改部署到一个空数据库中...

是否可能从Visual Studio(2012)数据库项目生成和更新EF模型?

更新: 还可以从dacpac文件生成它,这是一个不错的选择。是否可能?

更新: 在MS Build 2014会议上,ADO.NET团队建议未来的EF版本,如EF7,将仅使用Code First方法。

后来,他们澄清了新方法的名称不应该是Code First,尽管是基于代码的建模。也许不完全相同,但据我所知似乎非常相似

所以我将尝试@adam0101的解决方案。任何以CodeFirst结束的其他建议解决方案都是为了从SSDT项目迁移到EF的CodeFirst项目,而我想要的是两者的平稳共存(也许我是个梦想家...)。


Entity Framework 的哪个版本? - Erik Philips
1
我相信EF Power Tools具有将数据库进行反向工程的功能:http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d - millimoose
@millimoose:EF Power Tools不支持数据库项目。 - John Saunders
@ErikPhilips:我正在使用EF5,但我可以等待EF6... - Alex
1
这个功能在我看来非常有用,但据我所搜寻,即使是对于 VS 2013,它也不存在。 - Santhos
1个回答

1

我创建了项目SqlSharpener,它应该能够完成您所要求的操作。

例如,假设在SSDT项目中定义了以下表:

CREATE TABLE [dbo].[Tasks]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, 
    [Name] VARCHAR(50) NOT NULL, 
    [Description] VARCHAR(1000) NOT NULL, 
    [TaskStatusId] INT NOT NULL, 
    [Created] DATETIME NOT NULL , 
    [CreatedBy] VARCHAR(50) NOT NULL, 
    [Updated] DATETIME NOT NULL, 
    [UpdatedBy] VARCHAR(50) NOT NULL, 
    CONSTRAINT [FK_Tasks_ToTaskStatus] FOREIGN KEY ([TaskStatusId]) REFERENCES [TaskStatus]([Id])
)

CREATE TABLE [dbo].[TaskStatus]
(
    [Id] INT NOT NULL PRIMARY KEY, 
    [Name] VARCHAR(50) NOT NULL
)

您可以创建一个 T4 模板,以生成实体,如下所示:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace SimpleExample.EntityFrameworkCodeFirst
{
    public partial class TaskContext : DbContext
    {
        public TaskContext(): base()
        {
        }
        public DbSet<Tasks> Tasks { get; set; }
        public DbSet<TaskStatus> TaskStatus { get; set; }
    }


    [Table("Tasks")]
    public partial class Tasks
    {

        [Key]
        [Required]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int32? Id { get; set; }

        [Required]
        [MaxLength(50)]
        public String Name { get; set; }

        [Required]
        [MaxLength(1000)]
        public String Description { get; set; }

        [Required]
        public Int32? TaskStatusId { get; set; }
        [ForeignKey("Id")]
        public virtual TaskStatus TaskStatus { get; set; }

        [Required]
        public DateTime? Created { get; set; }

        [Required]
        [MaxLength(50)]
        public String CreatedBy { get; set; }

        [Required]
        public DateTime? Updated { get; set; }

        [Required]
        [MaxLength(50)]
        public String UpdatedBy { get; set; }
    }

    [Table("TaskStatus")]
    public partial class TaskStatus
    {

        [Key]
        [Required]
        public Int32? Id { get; set; }
        public virtual ICollection<Tasks> Tasks { get; set; }

        [Required]
        [MaxLength(50)]
        public String Name { get; set; }
    }
}

这个 T4 模板有一个工作示例,在简单的示例解决方案中。如果 SqlSharpener 目前无法处理某个使用案例,请随时添加一个问题(issue),我会看看是否可以添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接