首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#/:本地向模型添加脚本

C#/:本地向模型添加脚本
EN

Stack Overflow用户
提问于 2016-09-09 01:52:46
回答 2查看 149关注 0票数 1

我的团队可以读取一个由另一个团队维护的数据库。我们有许多只有我们运行的脚本,所以它们从来没有作为链式码添加到数据库中(我们也不希望它们是)。

在实体框架6中,是否可以在我的模型中包含一个包含存储过程的文件,以便我们可以利用EF中的代码生成?我们更希望代码看起来像:

代码语言:javascript
复制
using (var db = new DatabaseEntities())
{
    var properlyTypedResult = db.GetEntriesThatStartWith(firstName);
}

超过:

代码语言:javascript
复制
using (var db = new DatabaseEntities())
{
    var rawResult = db.Database.ExecuteSqlCommand("SELECT * FROM dbo.Person WHERE FirstName LIKE '@p0%'", firstName);
    var properlyTypedResult = CastAppropriately(rawResult);
}

该功能似乎缺少,但我想我会检查,我希望它在设计器视图,右键单击,添加新的->函数导入...。但这只允许向已经在数据库中的模型中添加sprocs。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-13 05:01:03

我找不到我想要的东西。我决定简单地编写我自己的代码生成,并尽可能多地利用实体框架。

  1. 在查询字符串在手的情况下,使用SqlDataAdapter和DataTable对数据库执行适当的操作

例如,

代码语言:javascript
复制
using (var context = new DbContext())    
{
    var dataTable = new DataTable();
    var connection = (SqlConnection)context.Database.Connection;
    if (connection != null && connection.State == ConnectionState.Closed)
        connection.Open();

    using (var adapter = new SqlDataAdapter(queryString, connection))
        adapter.Fill(dataTable);
}
  1. DataTable包含产生的列名以及它们的所有类型,现在我们所要做的就是为对象生成代码。

即,

代码语言:javascript
复制
var objectBuilder = new StringBuilder();
objectBuilder.AppendLine("public class QueryResult");
objectBuilder.AppendLine("{");
foreach (DataColumn column in dataTable.Columns)
{
    objectBuilder.AppendLine(String.Format("public {0} {1} { get; set; }", column.DataType.Name, column.ColumnName));
}
objectBuilder.AppendLine("}");
  1. 最后,在上下文对象上创建一个扩展方法:

即,

代码语言:javascript
复制
private static string GetQueryString(string firstName)
{
    return String.Format($"SELECT * FROM dbo.Person WHERE FirstName LIKE '{firstName}%'", firstName);
}
public static partial class DbContextExtensions
{
    public static List<QueryResult> GetEntriesThatStartWith(this DbContext context, string firstName)
    {
        return context.Database.SqlQuery<QueryResult>(GetQueryString(firstName)).ToList();
    }
}

现在,我们可以将它用作一个常规的sproc调用:

代码语言:javascript
复制
using (var db = new DbContext())
{
    var properlyTypedResult = db.GetEntriesThatStartWith(firstName);
}
票数 0
EN

Stack Overflow用户

发布于 2016-09-09 02:25:22

我想你忘了LINQ -第二个例子是.

代码语言:javascript
复制
List<People> people = (List<People>)db.Person.Where(f => f.FirstName.StartsWith(firstname)).ToList();

这应该接近你要找的东西。是你的朋友。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39402642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档