有没有办法在不添加.dbml文件的情况下使用Linq to SQL?

5
我正在使用Linq to SQL,并通过添加一个.dbml文件来作为我的应用程序和SQL服务器之间的桥梁。我很好奇是否有一种不使用.dbml文件的方式来使用Linq to SQL?我偶然发现了这个链接,但是它不是很易懂。请问有人能够解释一下吗?注意:请不要修改HTML标记。

1
你的意思是像这个SO问题中提出的解决方案吗? - Jeroen Heier
1
Link中提到的方法更多地采用手动编写DB表属性的方式来消耗DBML文件。唯一的区别是,我们不会拖放以自动创建.DBML文件。 - SharK
请参考此链接以获取更多信息:http://forums.asp.net/t/1465242.aspx?Can+you+use+Linq+without+DBML+file+。 - Smit Patel
dbml 最初会创建很多混乱,不易理解。先看看我的帖子,以最简单的方式开始。希望这能帮到你! - RBT
1
如果你想要的话,我认为Entity Framework Code-First更容易使用,特别是在关系映射方面。在使用上的区别(DbContext vs DataContext)并不多。 - Gert Arnold
2个回答

7
当然可以。实际上,当我第一次学习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; }

}

然后你可以在主函数中编写以下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);
}

1
值得一提的是,您需要引用 System.Data.Linq 组件。 - Adi Lester

2
如果需要使用上下文的属性(context.TableName)进行查询,则不行
您需要在某个地方生成类,可以自动生成或手动创建(实体框架代码优先方法)。
但是,没有什么魔法可以让上下文具有所有表格而不需要生成类文件 [在您的情况下,这是dbml的一部分]。
但是,您可以创建自己的类并使用TableAttribute。这是手动复制dbml正在执行的操作。请参阅此链接了解更多信息。
来自上述链接的一些示例:
[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"));

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