C# 指定的类型成员';用户名';在LINQ to实体中不支持
我试图使用url中的id参数显示特定用户的图像,但收到以下错误消息: LINQ to中不支持指定的类型成员“UserName” 实体。仅初始值设定项、实体成员和实体导航 支持属性 这是我的行动方法:C# 指定的类型成员';用户名';在LINQ to实体中不支持,c#,asp.net-mvc,entity-framework,linq,C#,Asp.net Mvc,Entity Framework,Linq,我试图使用url中的id参数显示特定用户的图像,但收到以下错误消息: LINQ to中不支持指定的类型成员“UserName” 实体。仅初始值设定项、实体成员和实体导航 支持属性 这是我的行动方法: [HttpGet] public ActionResult Show(String id) { var images = new List<Image>(); var db = new portfolio_project_db(); if (String.IsN
[HttpGet]
public ActionResult Show(String id)
{
var images = new List<Image>();
var db = new portfolio_project_db();
if (String.IsNullOrEmpty(id))
{
return RedirectToAction("Index", "Home");
}
else
{
images = db.Images.Where(x => x.UserName == id).ToList();
return View(images);
}
}
[HttpGet]
公共操作结果显示(字符串id)
{
var images=新列表();
var db=新投资组合_项目_db();
if(String.IsNullOrEmpty(id))
{
返回重定向到操作(“索引”、“主页”);
}
其他的
{
images=db.images.Where(x=>x.UserName==id.ToList();
返回视图(图像);
}
}
我已经阅读了关于这个错误的更多信息,据我所知,人们会得到这个错误,因为变量不是数据库中的一列,但我的表映像中确实有一个UserName字段
public partial class Image
{
public int ImageID { get; set; }
public string Title { get; set; }
public string ImagePath { get; set; }
public Nullable<int> UserID { get; set; }
public string UserName { get; set; }
}
CREATE TABLE [dbo].[Image] (
[ImageID] INT IDENTITY (1, 1) NOT NULL,
[Title] VARCHAR (50) NULL,
[ImagePath] NVARCHAR (MAX) NULL,
[UserID] INT NULL,
[UserName] NVARCHAR(20) NOT NULL,
PRIMARY KEY CLUSTERED ([ImageID] ASC)
);
公共部分类映像
{
公共int-ImageID{get;set;}
公共字符串标题{get;set;}
公共字符串ImagePath{get;set;}
公共可为空的用户标识{get;set;}
公共字符串用户名{get;set;}
}
创建表[dbo]。[Image](
[ImageID]整数标识(1,1)不为空,
[标题]VARCHAR(50)空,
[ImagePath]NVARCHAR(最大值)为空,
[UserID]INT NULL,
[用户名]NVARCHAR(20)不为空,
主键群集([ImageID]ASC)
);
我需要做什么不同的事情
请求:
public partial class portfolio_project_db : DbContext
{
public portfolio_project_db()
: base("name=portfolio_project_db")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Image> Images { get; set; }
}
public部分类公文包\u项目\u db:DbContext
{
公共投资组合项目数据库()
:base(“name=portfolio\u project\u db”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
抛出新代码FirstException();
}
公共虚拟数据库集映像{get;set;}
}
LINQ to Entities消息中不支持指定的类型成员“UserName”,这表明属性UserName
仍未映射到数据库中的UserName
列。以下是在数据库优先配置中启用属性映射的步骤(因为OnModelCreating()
方法中存在onnoticecodefirstexception()
):
a。使用EDMX designer(推荐)
1) 从数据模型类中删除现有的UserName
属性
2) 在实体设计器中打开模型的EDMX文件,然后在设计器曲面的任何空白区域中单击鼠标右键,然后选择“从数据库更新模型”选项
3) 在EDMX designer中保存所有更改,现在将自动启用UserName
属性
使用数据库中的UserName
列创建并映射
b。编辑EDMX文件以创建映射(高级-不推荐)
此方法需要编辑EDMX文件,通过在
、
和
部分中添加属性名称手动添加映射属性:
注意:每次在数据库中添加或更新列和/或表架构时,都应该更新模型以反映从数据库到数据模型类的所有更改。错误非常明显:
UserName
不是表定义架构的一部分。@TetsuyaYamamoto:请检查,如果你还没有:谢谢!存在意外CodeFirstException()
意味着您是先使用数据库还是先使用模型,是否可以确保属性已映射到EDMX文件中?通常DbSet
被声明为publicdbset-Images{get;set;}
,没有virtual
关键字。@Sandra您的方法是先使用数据库。您已经有了.edmx文件,因此每次更新数据库时,只需打开.edmx>右键单击,然后updatemodelfromdatabase
。您不应该生成模型manually@Sandra每次在数据库中添加新列时,都需要通过EDMX设计器中的updatemodelfromdatabase
选项重新生成数据模型类。它会自动生成属性名称及其映射类型。如果不使用该选项,则需要在text/XML编辑器中编辑EDMX文件,并创建自己的属性映射(不建议这样做)。