2015-10-21 3 views
3

Я новый ребенок в Dapper. Попытка включить CRUD-операции с Dapper и Dapper.SimpleCRUD lib. Вот пример кода ...
Мои данные модели ПохожаDapper.SimpleCRUD Вставка/обновление/получение сбоя с сообщением «У объекта должно быть хотя бы одно свойство [Key]»

Class Product 
{ 
    public string prodId {get;set;} 
    public string prodName {get;set;} 
    public string Location {get;set;} 
} 

Dapper Реализация - Вставка

public void Insert(Product item) 
{ 
    using(var con = GetConnection()) 
    { 
     con.Insert(item); 
    } 
} 

Поскольку PRODID в Db является тождество колонка это не удается. Как это указывает на то, что ProdId является столбцом Identity в базе данных?

Щеголеватый Реализация - Получить

public IEnumerable<Product> GetAll() 
{ 
     IEnumerable<Product> item = null; 
     using (var con = GetConnection()) 
     { 
      item = con.GetList<Product>(); 
     } 
     return item; 
} 

Это дает исключение:

"Entity должен иметь по крайней мере одно свойство [Key]"!

ответ

8

Это происходит, поскольку вы используете расширение Dapper, которое реализовало метод расширения CRUD Insert. В идеале это может быть достигнуто с помощью простого

con.Execute в Dapper, но поскольку вы хотите передать объект и создать запрос на вставку автоматически с помощью расширения, вам необходимо помочь ему понять, что является Первичным ключом для данного продукта юридическое лицо, следующее изменение должно помочь:

[Key] 
public string prodId {get;set;} 

где Key атрибут должен быть либо реализован в Dapper Extension или Component Model.

В качестве альтернативы вы можете переименовать prodId в Id, который автоматически сделает это ключом. Также проверьте следующее link, где вы можете создать отдельный картографа для объекта, определяя таким образом ключ, что работает в вашем случае

+0

Я попытался добавить атрибут [Ключ], но он не может найти, из какого lib он должен произойти. Пробовал использовать Dapper; и используя System.ComponentModel.DataAnnotations.Schema; должен ли я импортировать lib для этого? – user2066540

+1

Необходимо проверить реализацию DapperExtension от Github, обходное решение с уверенным выстрелом будет либо делать столбец Key как Id, который можно сопоставить с другим столбцом имени db, используя Dapper - Fluent Map - https://github.com/henkmollema/Dapper -FluentMap, или я предпочитаю использовать connection.Execute, который работает безупречно –

+0

Вы проверили ссылку в ответе, где вы можете создать явное сопоставление для Key, что было бы проще, выберите один из вариантов, чтобы заставить его работать –

1

Подключение к SQL Server 2016, у меня была эта ошибка как с Dapper.Contrib & Dapper.SimpleCRUD когда я забыл приложить первичный ключ к столбцу Идентификатора таблицы.

Первичный ключ, добавленный в таблицу, перепроектирован проект & опубликован для очистки кеша, и все это хорошо с обоими [Key] & [ExplicitKey] (последний в DapperContrib).