0

在我的“网上商店”mvc 应用程序中,我想将项目添加到数据库中。Items 表有 CreatedBy 字段,它是来自 User 表 UserId 字段的外键。在我将数据库放入 App_Data 文件夹之前,一切正常。现在我在尝试创建新项目时收到 SqlException:

INSERT 语句与 FOREIGN KEY 约束“FK_Item_contains_User”冲突。冲突发生在数据库“C:\USERS\ALEKSEY\REPOS\2\WEBSTORE\WEBSTORE\APP_DATA\WEBSTORE.MDF”、表“dbo.Users”、列“UserId”中。

这是 ItemRepository 类的 Create 方法:

public Item CreateItem(int productId, Guid userId)
    {
        var item = new Item
            {
                ProductId = productId,
                CreatedBy = userId,
            };
        _dataContext.Items.InsertOnSubmit(item);
        _dataContext.SubmitChanges(); // in this line the exception occures !
        return item;
    }

这是控制器方法 Create:

    [HttpGet]
    public ViewResult Create()
    {
        var p = _productRepository.CreateProduct("", "", 0, "", "", "");
        var userId = (Guid)Membership.GetUser().ProviderUserKey;
        var item = _itemsRepository.CreateItem(p.ProductId, userId);

        // some code
        return View(model);
    }

此外,我使用 Linq to Sql 模型拖放方法。
这是更改后的 web.config 连接字符串部分:

<connectionStrings>
<add name="WebStoreConnectionString" connectionString="Data Source=(LocalDB)\v11.0;
     AttachDbFilename=|DataDirectory|\WebStore.mdf;Integrated Security=True;Connect Timeout=30" 
    providerName="System.Data.SqlClient" />

<add name="DefaultConnection" connectionString="Data Source=|DataDirectory|\aspnet.sdf" 
     providerName="System.Data.SqlServerCe.4.0" />

正如我所说,在我将数据库移动到 App_Data 文件之前一切正常。我还尝试删除 Items 和 Users 表之间的依赖关系——完全相同的例外。

任何帮助都是合适的。提前致谢!

编辑:

好的,现在我真的打破了 Items 和 Users 表之间的依赖关系,并且没有发生异常。但!我必须以某种方式知道谁创建了每个产品,因此打破依赖关系不是一种选择。我还尝试删除所有初始化 CreatedBy 字段的代码。

有任何想法吗??

编辑(第 2 部分):

下面的第二条评论给出了一个很好的建议!我发现所有创建的用户现在都存储在 aspnet.sdf 数据库中!!!
但是如果我删除连接字符串“DeafaultConnection”:

<add name="DefaultConnection" connectionString="Data Source=|DataDirectory|\aspnet.sdf"
  providerName="System.Data.SqlServerCe.4.0" />  

我会得到 ConfigurationErrorsException:

"The connection name 'DefaultConnection' was not found in the applications 
configuration or the connection string is empty." 

在以下行中:

 var userId = (Guid)Membership.GetUser().ProviderUserKey;
4

1 回答 1

0

好的,正如我猜测的那样,问题出在配置中。连接字符串中的每个提供者(出于某种原因)都有“DefaultConnection”。我将其更改为“WebStoreConnectionString”。现在一切正常!

ps 谢谢@w0lf,他把想法推向了正确的方向)

于 2013-01-09T20:24:28.960 回答