【发布时间】:2016-06-17 05:33:29
【问题描述】:
我正在使用 Linq to SQL,并且总是通过添加一个 .dbml 文件作为我的应用程序和 SQL 服务器之间的桥梁,我只是好奇是否有任何方法可以在不使用 . dbml 文件?我偶然发现了Link here,但这是无法理解的,请有人对此有所了解。
【问题讨论】:
我正在使用 Linq to SQL,并且总是通过添加一个 .dbml 文件作为我的应用程序和 SQL 服务器之间的桥梁,我只是好奇是否有任何方法可以在不使用 . dbml 文件?我偶然发现了Link here,但这是无法理解的,请有人对此有所了解。
【问题讨论】:
当然可以。事实上,当我第一次学习 LINQ-to-Sql 时,dbml 文件的样板自动生成的代码实际上对我来说一开始就无法消化。所以我开始自己一个一个地装饰我的 POCO 类,然后开始学习编写 LINQ 查询。下面是一个快速入门示例:
我创建了一个数据库“businessLinqToSql”,其中包含一个名为Customer 的表。使用下面提到的 SQL 脚本:
USE [businessLinqToSql]
GO
/****** Object: Table [dbo].[Customer] Script Date: 06/17/2016 11:28:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
[ID] [int] NOT NULL,
[Name] [nchar](30) NOT NULL,
[Address] [nchar](30) NULL,
CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
创建一个 C# 控制台应用程序并添加一个名为 Customer.cs 的代码文件,如下所示。它将是您的 POCO 类,其中包含一些声明性属性,向 LINQ-to-SQL 提供程序提供有关数据库架构的提示:
[Table(Name="Customer")]
public class Customer
{
[Column(IsPrimaryKey = true)]
public int ID { get; set; }
[Column]
public string Name { get; set; }
[Column]
public string Address { get; set; }
}
然后你可以在你的 main 函数中写下面的 LINQ 查询:
private static void LinqToSql()
{
DataContext dataContext = new DataContext("data source=.;initial catalog=businessLinqToSql;integrated security=True;MultipleActiveResultSets=True");
Table<Customer> customers = dataContext.GetTable<Customer>();
IQueryable<string> query = from c in customers
where c.Name.Length > 5
orderby c.Name.Length
select c.Name.ToUpper();
foreach (string name in query) Console.WriteLine(name);
}
【讨论】:
如果您需要使用上下文的属性 (context.TableName) 进行查询,则 NO。
您需要在某个地方自动或手动生成类(实体框架代码优先方法)。
但是没有什么魔法可以让上下文在没有生成类文件的情况下拥有所有表[在你的情况下这是 dbml 的一部分]
但是,您可以创建自己的类并使用TableAttribute。这是您手动复制 dbml 正在执行的操作。查看此link 了解更多信息。
上面链接的一些例子:
[Table]
public class Customer
{
[Column(IsPrimaryKey=true)]
public int ID;
[Column]
public string Name;
}
public class DemoDataContext : DataContext
{
public DemoDataContext (string cxString) : base (cxString) { }
public Table<Customer> Customers { get { return GetTable<Customer>(); } }
public Table<Purchase> Purchases { get { return GetTable<Purchase>(); } }
}
用法:
var db = new DataContext();
var customers = db.GetTable<Customer>();
var query = customers.Where (c => c.Name.StartsWith ("a"));
【讨论】: