Присоединить: невозможно добавить объект с ключом, который уже используется - PullRequest
0 голосов
/ 17 июля 2010

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

Я получаю DuplicateKeyException: Невозможно добавить объект с ключом, который ужев использовании.Вот мой репозиторий SqlProducts:

public class SqlProductsRepository : IProductsRepository
{
    private Table<Product> productsTable;
    private Table<Image> imagesTable;

    public SqlProductsRepository(string connectionString)
    {
        productsTable = (new DataContext(connectionString)).GetTable<Product>();
        imagesTable = (new DataContext(connectionString)).GetTable<Image>();

        // Populate all of the images for each product found
        foreach (Image image in imagesTable)
        {
            productsTable.Where<Product>(x => x.ProductID == image.ProductID).FirstOrDefault().Images.Add(image);
        }
    }

    public IQueryable<Product> Products
    {
        get { return productsTable; }
    }

    public IQueryable<Image> Images
    {
        get { return imagesTable; }
    }

    public void SaveProduct(Product product)
    {
        EnsureValid(product, "Name", "Description", "Category", "Price");

        if (product.ProductID == 0)
            productsTable.InsertOnSubmit(product);
        else
        {            
            productsTable.Attach(product);

            productsTable.Context.Refresh(RefreshMode.KeepCurrentValues, product);
        }

        productsTable.Context.SubmitChanges();
    }

Проблема где-то в добавлении imagesTable. Если я делаю это для Продукта, в котором нет изображений, проблема не возникает.Эта проблема возникает только тогда, когда продукт имеет изображения.Продукт и изображение довольно просты, как и следовало ожидать:

[Table(Name = "Images")]
public class Image
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)]
    public int ImageID { get; set; }

    [Column] public int ProductID { get; set; }
    [Column] public int SortOrder { get; set; }
    [Column] public string Path { get; set; }
}

[Table(Name = "Products")]
public class Product : IDataErrorInfo
{
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync=AutoSync.OnInsert)]
    public int ProductID { get; set; }

    [Column] public string Name { get; set; }
    [Column] public string Description { get; set; }
    [Column] public decimal Price { get; set; }
    [Column] public string Category { get; set; }

    private IList<Image> _images;
    public IList<Image> Images {
        get
        {
            if (_images == null)
                _images = new List<Image>();
            return _images;
        }
        set
        {
            _images = value;
        }
    }

Эта проблема убивает меня.Я испробовал все виды вариаций, включая получение исходного продукта первым и передачу его в качестве второго параметра Attach (в дополнение к просто передаче «true» в качестве второго параметра).

Кто-нибудь знаетчто может вызвать это?

1 Ответ

0 голосов
/ 19 июля 2010

Первое наблюдение. Предполагая, что на основе тегов используется LINQ to SQL, попробуйте использовать один контекст данных и LoadOptions Что-то вроде (не проверено):

private Table<Product> productsTable;
private Table<Image> imagesTable;
private DataContext context;

public SqlProductsRepository(string connectionString)
{
    context = new DataContext(connectionString);
    var loadOptions = new DataLoadOptions();
    loadOptions.LoadWith<Product>(item => item.Image);
    context.LoadOptions = loadOptions;
    productsTable = context.GetTable<Product>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...