带接口的InsertOnSubmit(LINQ to SQL)

时间:2009-11-11 15:28:13

标签: linq linq-to-sql interface

在我们的代码中,我们有:

public interface ILogMagazine
{
 string Text { get; set; }

 DateTime DateAndTime { get; set; }

 string DetailMessage { get; set; }
}

SimpleDataContext: DataContext
{
  public Table<ILogMagazine> LogMagaines
  {
    get { return GetTable<ILogMagazine>(); }
  }
}

我们尝试:

DataContext db = new SimpleDataContext("...");

ILogMagazine lg = new LogMagazine()
{
 Text = "test",
 DateAndTime = DateTime.Now,
 DetailMessage = "test",
};

db.LogMagazines.InsertOnSubmit(lg); // Exception thrown
db.SubmitChanges();

例外: System.InvalidOperationException:“DataLayer.ILogMagazine”类型未映射为表格。


我们如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

错误是因为你没有应用[Table]属性(通常它会进入类类型,在你的情况下是接口类型),但即使你这样做我也看不到它。这就是映射的完成方式 - 当您调用GetTable时,它会查找Table属性以了解插入/查询数据的位置。

那就是说,我很确定你不能用界面做到这一点。 GetTable上的类型必须具体,因为它使用GetTable上传递(或推断)的泛型arg来知道要为查询创建的对象。虽然它在技术上可以用于插入,但是插入和查询都使用相同的GetTable - 它肯定不适用。同样的原因XmlSerializer和DataContractSerializer不能与接口一起使用。

您始终需要具体类型,但您的实体类型仍然可以实施接口。我猜你试图在某个地方(也许是服务层)穿梭它们,你可能需要重新考虑一下。