SMO DependencyWalker,多对多关系问题

时间:2011-05-05 22:14:13

标签: c# sql-server code-generation smo

我正在尝试发现数据库结构,以生成某种POCO,

我使用此代码段来发现相关表格,

var result = new ArrayList();
DependencyWalker w = new DependencyWalker(server);      
DependencyTree tree = w.DiscoverDependencies(new SqlSmoObject[]{tbl}, DependencyType.Children);
DependencyCollection depends = w.WalkDependencies(tree);

foreach (DependencyCollectionNode dcn in depends)
{
    //System.Windows.Forms.MessageBox.Show( tbl.Name + " -> " +  dcn.Urn.Parent);           
    if (dcn.Urn.Type == "Table" && dcn.Urn.GetNameForType("Table") != tbl.Name)
    {
        var tblName = dcn.Urn.GetNameForType("Table");
        result.Add(tblName);
    }
}

return result;

这适用于数据库中的每个表,除了那些具有Many-to-Many关系

的表

例如

Car

CarColor

Employee

CarOwnerHistory
CarOwnerHistory

,我与CarEmployee都有关系,每个Car都有CarColor

虽然CarColorCarOwnerHistory无关,但DependencyCollection会引用CarOwnerHistory

这是生成的代码

public class Car {
  public virtual IList<CarOwner> CarOwner { get; set; }
  public virtual CarColor CarColor { get; set; }
}

public class CarColor {  
  public virtual IList<CarOwner> CarOwner { get; set;}  //:( Why ???
  public virtual IList<Car> Car { get; set;}    
}

public class CarOwner {
  public virtual Car Car { get; set; }
  public virtual Employee Employee { get; set; }                                
}
这是一个错误吗?如果是的话,有什么工作吗?

1 个答案:

答案 0 :(得分:1)

如果要创建表格映射,此链接可能会有所帮助。我没有使用LINQ的POCO对象,因为我更喜欢为简单的事情创建我的域对象。这是一个可能有用的网址。我使用这个删除顺序,或者更确切地说是帮助清除一次数据库。

http://www.jasinskionline.com/technicalwiki/Default.aspx?Page=List-Tables-in-Dependency-Order-SQL-Server&NS=&AspxAutoDetectCookieSupport=1