代码之家  ›  专栏  ›  技术社区  ›  Alex

从Visual Studio数据库项目生成实体框架模型

  •  12
  • Alex  · 技术社区  · 12 年前

    我正在将EF5与数据库优先模型一起使用。以及visual Studio中的数据库项目,用于维护应用程序的Sql Server数据库架构。

    为了更新EF模型,我正在一个空数据库中部署更改。。。

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

    更新: 也可以从 dacpac 文件是一个不错的选项。有可能吗?

    更新: 在MS Build 2014会议上,ADO.NET团队建议EF的未来版本,如EF7,将只使用代码优先的方法。

    后来,他们澄清了新方法的名称不应该是代码优先,尽管代码基础建模。也许不完全一样,但是 as far as I read 似乎是这样 quite similar to me .

    所以我要试试@adam0101溶液。任何其他提出的以CodeFisrt结束的解决方案都追求从SSDT项目迁移到EF的CodeFisrt项目,我想要的是两者的平稳共存(也许我是一个梦想家…)。

    1 回复  |  直到 10 年前
        1
  •  1
  •   adam0101    10 年前

    我创建了这个项目 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; }
        }
    }
    

    有一个 working example simple example solution 。如果存在SqlSharpener当前无法处理的用例,请随时 add an issue 我看看能不能加进去。