2009-11-11 5 views
0

В нашем коде мы имеем:InsertOnSubmit с интерфейсами (LINQ к SQL)

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' не отображается в виде таблицы.


Как мы можем решить эту проблему?

ответ

0

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

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

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

+0

Спасибо. Я попытаюсь переосмыслить нашу систему ... – Sasha

Смежные вопросы