我有一个方法来删除我所有的表。
我想知道我是否可以:
(1)迭代模型中的元数据来完成相同的事情?
(2)重置身份插入计数一路上?
注意:我不想删除整个数据库,只删除所有表。
下面是我想转换为通用循环的代码: public void Delete() {
using (var db = this.DirectAgentsEntities)
{
db.StartingBalances.DeleteObjects(db.StartingBalances);
...
db.RecordSourceTypes.DeleteObjects(db.RecordSourceTypes);
db.SaveChanges();
}
}
static class Extensions {
static public void DeleteObjects<TEntity>(this ObjectSet<TEntity> set, IEnumerable<TEntity> data) where TEntity : class {
foreach (var entity in data)
set.DeleteObject(entity);
}
}
可能更简单:
- 删除数据库
- 创建数据库 创建表
edmx文件就是xml,所以可以遍历它,然后对于找到的每个表:
- 删除表名
- DBCC CHECKIDENT (Tablename, reseed, 0)
只需编写一个存储过程并将其导入到edmx中。这将是最快的方式与实体框架。
我接受了Shiraz的建议,并提出了一个完整的答案,作为一个导入的SProc和T4模板:
SProc:
ALTER procedure dbo.DeleteTable
(
@tableName varchar(500)
)
AS
declare @sql varchar(1000)
set @sql = 'delete from ' + @tableName
exec (@sql)
return
T4模板:
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ Assembly Name="System.Core.dll" #>
<#@ Assembly Name="System.Xml.dll" #>
<#@ Assembly Name="System.Xml.Linq.dll" #>
<#@ Assembly Name="System.Windows.Forms.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#
string ns = "EomApp1.Formss.AB2.Model";
string cn = "Util";
string edmxFile = "\ABModel.edmx";
string inputContent = System.IO.File.ReadAllText(System.IO.Path.GetDirectoryName(this.Host.TemplateFile) + edmxFile);
#>
namespace <#=ns#>
{
static public class <#=cn#>
{
<#DeleteTablesCodeGen(inputContent);#>
}
}
<#+
void DeleteTablesCodeGen(string input)
{
XNamespace edmxNS = "http://schemas.microsoft.com/ado/2008/10/edmx";
XNamespace ssdlNS ="http://schemas.microsoft.com/ado/2009/02/edm/ssdl";
System.Xml.Linq.XDocument xd = System.Xml.Linq.XDocument.Parse(input);
var tables =
from c in xd.Root
.Element(edmxNS + "Runtime")
.Element(edmxNS + "StorageModels")
.Element(ssdlNS + "Schema")
.Element(ssdlNS + "EntityContainer")
.Elements(ssdlNS + "EntitySet")
select new
{
Name = c.Attribute("Name").Value,
EntitySet = c
};
foreach (var table in tables)
{
#>
static public void Delete<#=table.Name#>(DirectAgentsEntities model)
{
model.DeleteTable("<#=table.Name#>");
}
<#+
}
}
#>