C# 如何将ASP Net成员资格提供程序用户ID保存到另一个sql表中?

C# 如何将ASP Net成员资格提供程序用户ID保存到另一个sql表中?,c#,mysql,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Mysql,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我想获取ASP NET MVC成员资格提供程序UserProfile表UserId字段并将其保存到单独的表中 这是我的模型 public class Product { public int ProductId { get; set; } public int UserId { get; set; } public string ProductName { get; set; } } 我不想再将UserId字段添加到我的模型中。 这是我的控制器: private Us

我想获取ASP NET MVC成员资格提供程序UserProfile表UserId字段并将其保存到单独的表中

这是我的模型

public class Product
{
    public int ProductId { get; set; }
    public int UserId { get; set; }
    public string ProductName { get; set; }

}
我不想再将UserId字段添加到我的模型中。 这是我的控制器:

private UsersContext db = new UsersContext();
// GET: /ProCont/
int UserID = (int)Membership.GetUser().ProviderUserKey;
public ActionResult Index()
{
    return View(db.Products.Where(p => p.UserId == UserID).ToList());
}
怎么办

问候
Dostdar

真的不清楚你在问什么?但您的意思是想将
UserID
存储到数据库中的
Products
表中。然后您可以指定您的模型类,如下所示

[System.ComponentModel.DataAnotations.Table("Products")]
public class Product
{
    public int ProductId { get; set; }
    public int UserId { get; set; }
    public string ProductName { get; set; }
}
您可以手动创建表
Products
,也可以使用
EF code first Migrations
创建快照并更新数据库以添加新创建的表

然后您可以向表中添加数据,如

Product p1 = new Product
{
  UserID = (int)Membership.GetUser().ProviderUserKey,
  ProductName = "XXX";
};

db.Products.Add(p1);
db.SaveChanges();
根据您的评论:


您目前拥有的是正确的方法,否则无法将产品与特定用户联系起来。这就是所谓的
引用完整性约束
。这里,模型类中的
UserID
充当
外键。您无法自动执行此操作。

免责声明:在已存在的答案中作为编辑太长,因此会在单独的答案中发布

要回答您关于如何在模型对象中添加
UserID
字段的问题,下面是代码段的详细说明

考虑到您已经使用ADO.NET实体数据模型添加了
产品
实体
。使用您喜欢的任何名称将单独的类文件添加到您的
Models
文件夹中,并具有以下代码。下面的代码段装饰您的模型对象

using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace MvcApplication1.Models
{
    [MetadataType(typeof(productMetadata))]
    public partial class Product
    {

    }

    public class productMetadata
    {
        [HiddenInput(DisplayValue = false)]
        public int ProductId { get; set; }

        // to make the field hidden and will not display in browser
        [HiddenInput(DisplayValue = false)]
        //directing that don't scaffold this column since it will be added manually
        [ScaffoldColumn(false)]
        public int UserId { get; set; }
    }
}
您可以直接修改EF中自动生成的
产品
类,但如果重新生成EF模型,则更改将消失。所以,上面显示的方法最好使用
MetadataType
属性

控制器动作方法:

namespace MvcApplication1.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Create([Bind(Include = "ProductName, ProductId")]Product product) 
    {
        SampleContext db = new SampleContext();

        if (ModelState.IsValid) 
        {
            product.UserId = (int)Membership.GetUser().ProviderUserKey;
            db.Products.Add(product); 
            db.SaveChanges(); 
            return RedirectToAction("Index"); 
        } 

        return View(product); 
    }

    public ActionResult List()
    {
        SampleContext db = new SampleContext();
        IEnumerable<Product> products = db.Products.ToList();
        return View(products);
    }
}
}
namespace mvcapapplication1.Controllers
{
公共类HomeController:控制器
{
//
//回家/
公共行动结果索引()
{
返回视图();
}
公共操作结果创建()
{
返回视图();
}
[HttpPost]
公共操作结果创建([Bind(Include=“ProductName,ProductId”)]Product)
{
SampleContext db=新的SampleContext();
if(ModelState.IsValid)
{
product.UserId=(int)Membership.GetUser().ProviderUserKey;
db.Products.Add(产品);
db.SaveChanges();
返回操作(“索引”);
} 
返回视图(产品);
}
公共行动结果列表()
{
SampleContext db=新的SampleContext();
IEnumerable products=db.products.ToList();
返回视图(产品);
}
}
}
视图(特别是创建视图):

@model MvcApplication1.Models.Product

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Product</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.ProductName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ProductName)
            @Html.ValidationMessageFor(model => model.ProductName)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@model mvcapapplication1.Models.Product
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
产品
@Html.LabelFor(model=>model.ProductName)
@Html.EditorFor(model=>model.ProductName)
@Html.ValidationMessageFor(model=>model.ProductName)

} @ActionLink(“返回列表”、“索引”)

请注意,该视图只有
productname
的可编辑控件作为输入字段,因为
ProductID
是一个标识列,
UserID
从代码中获取值,而不是从用户获取值。

@Rahul,我有一个产品表,用户可以在其中输入他们的产品。我面临的问题是,当用户登录时,他/她可以看到所有用户的产品。我想阻止这种情况,然后在模型类中添加一个UserId,然后在控制器类中使用where类来阻止其他用户查看其他用户产品。现在,当我创建一个产品时,我必须为每个产品条目输入用户ID,这是一个令人头痛的问题。我不希望这样,相反,我希望在用户登录并希望创建产品时自动执行此操作,用户id应自动获取并保存到数据库。您当前拥有的是正确的方法,否则无法将产品与特定用户关联。这就是所谓的参照完整性。这里,模型类中的
userid
充当
外键。你就是不能自动完成它。@rahul怎么做?告诉我更多关于我是MVC新手的信息?这不是关于MVC,而是关于DB的概念。最后,这些模型将表示DB实体,所以,如果产品表中没有userid,那么尝试将产品与用户关联,看看是否可以这样做。这会让你明白我在说什么。好吧@Rahul我会让这个用户ID出现在我的模型类中,但我不清楚的是,当用户想要创建产品时,如何自动保存这个用户ID?我无法获取您的代码?我正在使用EF迁移,我如何才能将该用户ID添加到我的表中?我无法捕获此@Rahulthere无需感谢!这是一个多么简单的问题啊。非常感谢你的努力!请你也解决这个问题好吗?