2011-08-26 47 views
0

我有一个方法来删除我所有的表。我可以编程方式删除EDMX模式下的所有实体吗?

我想知道如果我能:

(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); 
    } 
} 

回答

1

这可能是简单的:

  • 删除数据库
  • 创建数据库
  • 创建表

The EDMX文件仅仅是XML,所以你可以遍历它,然后为每个表你会发现:

  • 从表名删除
  • DBCC CHECKIDENT(表名,补种,0)
+0

感谢您的建议,它让我回到了我的答案 –

1

只写了存储过程并将其导入到您的edmx。这将是实体框架最快的方式。

0

我把设拉子的建议,并拥有完整的回答我的问题作为一个进口的存储过程和T4模板想出了:

存储过程:

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#>"); 
     } 
<#+ 
     } 
    } 
#> 
相关问题