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

标签 c# visual-studio entity-framework visual-studio-2012 ef-database-first

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

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

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

更新:dacpac 文件生成它也是一个不错的选择。可能吗?

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

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

所以我将尝试@adam0101 解决方案。任何其他以 CodeFisrt 结尾的提议解决方案都追求从 SSDT 项目迁移到 EF 的 CodeFisrt 项目,而我想要的是两者的顺利共存(也许我是一个梦想家......)。

最佳答案

我创建了项目 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 中的此 T4 模板.如果有 SqlSharpener 当前无法处理的用例,请随时 add an issue我会看看是否可以添加它。

关于c# - 从 Visual Studio 数据库项目生成 Entity Framework 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392636/

相关文章:

c# - 如何在 Visual Studio Performance Analyzer 中查看毫秒而不是样本百分比

c# - Parasoft 无法识别自定义 IEnumerable 扩展方法 .IsNullOrEmpty()

visual-studio - 谁喜欢 Visual Studio 中的#regions?

c# - 为所有项目类型注册扩展程序提供程序

c# - 复杂类型引用的 EagerLoad 实体

c# - 摆脱 servicestack.text json de/serialization 中的时区部分?

c# - 如何为 FileHelpers 元素类的字段定义默认值

node.js - 什么是 .ntvs_analysis.dat

c# - 如何从 Entity Framework 中的存储过程中获取数据作为数据集

entity-framework - ReferentialConstraint 中的依赖属性映射到一对一关系上存储生成的列错误