【问题标题】:object-relational mapping对象关系映射
【发布时间】:2011-04-24 19:53:44
【问题描述】:

我需要将复杂数据类型的实例存储到关系数据库中。 有没有一种方法可以在不首先对数据库结构进行建模的情况下做到这一点,就像在 ado.net 中所做的那样?应该从类结构创建数据库(或表)结构。该类具有一些属性,例如整数、字符串或布尔值,但也可能具有更复杂的属性。 我很感激每一个帮助建议...

我想在 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; }
}

所以,正如我所说,我可以创建这些类的实例并将它们写入数据库。但是当我尝试从数据库数据创建新实例时,只有 int 和“Bar”类型的字符串被恢复,但 Foos 的集合是空的。我的数据库上下文如下所示:

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


有什么想法吗?

【问题讨论】:

    标签: c# .net orm mapping


    【解决方案1】:

    是的,这是可能的,您必须为此使用实体框架 4。这种方法称为“代码优先”。

    您可以在 ScottGu 的帖子 Code-First Development with Entity Framework 4 中阅读更多相关信息

    【讨论】:

      【解决方案2】:

      最好使用 ORM 工具,该工具可以根据您的域模型(类)为您构建数据库。

      看看NHibernate,Entity Framework 不胜枚举。

      【讨论】:

        【解决方案3】:

        使用带有“代码优先”的 Entity Framework 4,我得到了我想要的东西。要将我上面发布的类中的对象写入数据库,您只需定期创建对象:

        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 连接到数据库。创建您的对象并将它们设置为数据库数据:

        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üßung Jucker!

        【讨论】:

          猜你喜欢
          • 2013-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多