【问题标题】:Saving and Retrieving Entities of different types using LINQtoSQL使用 LINQtoSQL 保存和检索不同类型的实体
【发布时间】:2011-01-15 17:51:17
【问题描述】:

免责声明:有点 C# 新手 - 在 QA 工作几年后,第一次软件开发工作。

我意识到这个问题的风格以前曾被问过(LINQtoSQL 中的继承等),但我希望我能以不同的方式提出这个问题。

在我的数据库中,我将有一个“Event”的超类型和多个子类型:例如 Conference、Meeting 和 Appointment。

Event
  Id (PK)
  TypeId (FK EventTypes.Id)
  Title

Conference
  Id (PK, FK Event.Id)
  Cost
  Topic

Meeting
  Id (PK, FK Event.Id)
  Location
  Organizer

Appointment
  Id (PK, FK Event.Id)
  Time
  Address

我使用 Rob Conery 的 MVC StoreFront 应用程序作为参考。他本质上是从数据库中获取数据并创建类对象,手动将 Event.Id 映射到 db.Event.Id 等。

我想用我的事件数据模型来做这件事——我想检索所有事件,并有一个足够动态的 LINQ 表达式来根据某些条件(例如,TypeId)创建各种事件类型。

var result = from e in db.Events
             select new IEvent 
             {
                // Little help? ;)
              };

找到一种方法来实现它会很棒,这样每个事件类型都知道如何保存自己和检索自己 - 我担心必须为每种类型编写相同的代码,只是改变字段。有意义吗?

我确实看到有人提出问题,有人回答如下:

public bool Save<T>() {}

问题是,我不确定将这段代码放在哪里。我也不确定是否应该使用 IEvent 接口或 Event 部分类。

我现在将用一个高级的谢谢你来结束这个怪物问题,感谢那些可以提供帮助/建议的人。

-- 编辑:进展顺利——使用 IEvent 从 DB 到 Views all :) (This Question Helped A Lot)

public class SqlEventRepository : IEventRepository

  public IQueryable<IEvent> getEvents() {
     // Get Events without doing a query for each type..possible?
     var eventType1 = {query};
     var eventType2 = {query};

     return {concat of all queries};
  }

  public bool SaveEvent(IEvent) {
    // Can I avoid calling a save function for each type of event?

}

【问题讨论】:

    标签: linq-to-sql inheritance orm linq-to-entities


    【解决方案1】:

    你可以有一个帮助类来放入你的 Save&lt;T&gt;() 方法。类似于 SaveEvents 类。

    当您想使用 LINQ 保存时,我不太确定是否可以使用泛型,因为您不知道 T 是什么,因此无法更新查询中的属性。

    我会使用继承,然后在传递子类的地方,使用父类(事件)作为参数。然后,您可以轻松地转换为子类以访问 LINQ 查询中的这些属性。

    编辑:

    类似这样的:

    public class Event : IEvent (Interface implement common properties to all Event type classes)
    {
        // your code
    }
    
    public class MeetingEvent : IEvent
    {
    
       public string MeetingEvent
       {
          get;
          set;
       }
    
        // add IEvent implementation...
    
    }
    
    public class EventManager
    {
    
       public void MyMethod (IEvent event)
       {
    
           MeetingEvent Mevent = (MeetingEvent)event;
    
           Mevent.DoSomework();
    
           // now you can cast all eventclasses to and from IEvent passed as a parameter.
       }
    
    }
    

    【讨论】:

    • 托尼,很棒的信息。如果您有机会提供链接或示例代码,那就太棒了:)
    • 确实如此——我想我的一部分想要从头到尾找到“THE”解决方案,但是如果你不把头撞到墙上几次,编程有什么乐趣? ;)。这里有一个问题 - IEvent 有它自己的成员: Title {get;set} - 为什么我需要实现 Title MeetingEvent : IEvent 如果我只是像在 IEvent 中一样让它成为 get/set - 似乎是多余的。谢谢托尼!
    • 如果你使用接口,你必须在你的类中实现它,因为接口不是一个实现,只是一个签名。但是如果你有自动属性,那么它似乎是多余的。但是,如果您不想实现某些东西,则可以使用抽象类而不是接口。
    • 更多进展 - 查看我的第一个编辑以了解更多问题 :)。再次感谢您的输入。它让我朝着我想去的方向前进!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多