InsertOnSubmit с интерфейсами (LINQ to SQL) - PullRequest
0 голосов
/ 11 ноября 2009

В нашем коде мы имеем:

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 голосов
/ 12 ноября 2009

Ошибка в том, что вы не применили атрибут [Table] (обычно он бы использовал тип класса, в вашем случае тип интерфейса), но я не вижу его работоспособным, даже если вы это сделали. Вот как выполняется сопоставление - когда вы вызываете GetTable, он ищет атрибут Table, чтобы узнать, откуда вставить / запросить данные.

Тем не менее, я уверен, что вы не можете сделать это с помощью интерфейса. Тип в GetTable должен быть конкретным, потому что он использует общий аргумент, переданный (или выведенный) в GetTable, чтобы знать, какой объект создать для запроса. Хотя технически он может работать для вставок, один и тот же GetTable используется как для вставок, так и для запросов, но он наверняка не будет работать. По той же причине XmlSerializer и DataContractSerializer не работают с интерфейсами.

Вам всегда будет нужен конкретный тип, но ваши типы сущностей все еще могут реализовывать интерфейсы. Я предполагаю, что вы пытаетесь перенести их куда-нибудь (возможно, на уровень обслуживания), и вам, вероятно, придется немного обдумать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...