使用LINQtoSQL保存和检索不同类型的实体

时间:2010-02-11 14:20:26

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

免责声明:C#newbie的一点点 - 在QA工作几年之后的第一次软件开发工作。

我之前已经意识到这个问题的味道(LINQtoSQL中的继承等),但我希望我能以不同的方式提出这个问题。

在我的数据库中,我将有一个超级类型的“事件”和多个子类型:例如会议,会议和约会。

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分部类。

我现在将结束这个怪物问题,并向那些可以提供帮助/建议的人表示感谢。

- 编辑:良好的进展 - 从DB到视图所有与IEvent :)(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?

}

1 个答案:

答案 0 :(得分:1)

您可以使用帮助程序类来放置Save<T>()方法。类似于SaveEvents类。

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

我使用继承,然后在传递子类的地方,使用父类(Event)作为参数。然后,您可以非常轻松地转换为子类以访问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.
   }

}