【问题标题】:Is there any way to use Linq to SQL without adding the .dbml file?有什么方法可以在不添加 .dbml 文件的情况下使用 Linq to SQL?
【发布时间】:2016-06-17 05:33:29
【问题描述】:

我正在使用 Linq to SQL,并且总是通过添加一个 .dbml 文件作为我的应用程序和 SQL 服务器之间的桥梁,我只是好奇是否有任何方法可以在不使用 . dbml 文件?我偶然发现了Link here,但这是无法理解的,请有人对此有所了解。

【问题讨论】:

  • 您的意思是像this SO question 中建议的解决方案吗?
  • Link中提到的方法更多的是通过手动写入DB表的属性来使用DBML文件的相同方法。唯一的区别。就是,我们不是通过拖拽来自动创建.DBML文件的。
  • 参考这个,也许你可以从这个Link找到更多。
  • dbml 最初会产生很多混乱来消化。看看我的帖子,以一种普通的方式开始。希望这会有所帮助!
  • 如果你愿意,我认为实体框架代码优先要容易得多,尤其是。当涉及到关系映射时。使用上的差异(DbContext vs DataContext)并不多。

标签: c# linq


【解决方案1】:

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

【讨论】:

  • 值得一提的是您需要引用 System.Data.Linq 程序集。
【解决方案2】:

如果您需要使用上下文的属性 (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"));

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2010-11-09
    • 2011-01-20
    相关资源
    最近更新 更多