我可以以编程方式删除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);
    }
}

可能更简单:

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

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#>");
        }
<#+
        }
    }
#>

最新更新