2010-10-13 257 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!