2010-10-13 249 views
4

我需要将复杂数据类型的实例存储到关系数据库中。 有没有办法做到这一点,而不是先模仿数据库结构,就像在ado.net中完成一样?数据库(或表)结构应该从类结构中创建。该类有一些属性,如int,字符串或bools,但也可能有更复杂的属性。 我对每一个帮助的建议表示感谢...对象关系映射

我想这样做,在C#...

更新:

谢谢您的回信。我尝试了EF 4的“代码优先”(非常感谢Ramesh)并将我的对象存入数据库。但是现在我遇到了一个问题,即要将数据从数据库中移回到对象的实例中。我的类看起来像:

class Foo { 
    public int id { get; set; } 
    public string Woot { get; set; } 
} 

class Bar { 
    public int id { get; set; } 
    public string name { get; set; } 
    public ICollection<Foo> FooList { get; set; } 
} 

所以,我说我可以创建这些类的实例,并将其写入到数据库。但是,当我尝试从db数据创建新的实例时,只是int和“Bar”类型的字符串被恢复,但Foos的Collection是emtpy。我的数据库上下文看起来像这样:

class DBstructure: DbContext 
{ 
    public DbSet<Foo> Foos { get; set; } 
    public DbSet<Bar> Bars { get; set; } 
} 


任何想法?

回答

0

最好是使用ORM工具,可以从您的域模型(类)建立数据库,为你在这里读到很多关于这一点。

请看NHibernate,Entity Framework提几个。

0

我用“代码优先”使用实体框架4得到了我想要的结果。写从我上面贴到DATABSE的类的对象,你只需要regulary创建对象:

Foo foo = new Foo(); 
foo.Woot = "foo1"; 
Foo foo2 = new Foo(); 
foo2.Woot = "foo2"; 

Bar bar = new Bar(); 
bar.name = "bar1"; 
bar.Whee = new List<Foo>(); 
bar.Whee.Add(foo); 
bar.Whee.Add(foo2); 

然后创建DbContext对象,其他对象添加到这一背景下并调用的SaveChanges()方法:

DBstructure dbconn = new DBstructure(); 
dbconn.Database.Connection.ConnectionString = connectionString //depends on your DB 
dbconn.Bars.Add(bar); 
dbconn.Database.Connection.Open(); 
dbconn.SaveChanges(); 
dbconn.Database.Connection.Close(); 

这将创建具有表格“Foos”和“Bars”的新数据库以及另一个链接表来管理实体之间的关系。

从数据库信息创建对象也很容易。就像上面所做的那样,通过DbContext连接到数据库。创建你的对象,并将它们设置为db数据:

DBstructure dbconn = new DBstructure(); 
dbconn.Database.Connection.ConnectionString = connString; 
dbconn.Foos.ToList(); //seems that you have to do that 
dbconn.Bars.ToList<Bar>(); 

Bar barFromDB = new Bar(); 
barFromDB = dbconn.Bars.First<Bar>(); 

在我的应用程序中正常工作。对不起,奇怪的类和变量名称。我刚刚从我的测试应用程序复制了代码。希望能帮助别人...

GrüßungJucker!