- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 View 模型,它使用 valueinjector 从模型中注入(inject)值(我还实现了 TPT 继承)。在此过程中,由于我的自定义属性之一(不在模型源中的属性),我不断收到以下错误:
Object reference not set to an instance of an object.
我发现 valueinjector 会不时地访问该属性。如下例所示,自定义属性为“FullName”。
public class EmployeeVm
{
public EmployeeVm(Employee employee)
{
this.InjectFrom<Employee>(employee);
}
public EmployeeVm(int id):this(new Context().Employees.Find(id))
{
}
public EmployeeVm()
{
}
public int EmployeeId { get; set; }
[Display(Name = "First Name")]
[Required(ErrorMessage = "Pleae enter First Name"), StringLength(50)]
public string FirstName { get; set; }
[Display(Name="Middle Name"), StringLength(50)]
public string MiddleName { get; set; }
[Display(Name="Last Name"), StringLength(50)]
[Required(ErrorMessage = "Please enter Last Name")]
public string LastName { get; set; }
public string FullName {
get
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("<b>");
stringBuilder.Append(LastName.ToUpper());
stringBuilder.Append("</b>");
if (!string.IsNullOrEmpty(MiddleName))
{
stringBuilder.Append(", ");
stringBuilder.Append(MiddleName);
}
stringBuilder.Append(", ");
stringBuilder.Append(LastName);
return stringBuilder.ToString();
}
}
}
我想到的唯一解决方案是让 valueinjector 忽略该属性,这样它就不会在设置其他属性之前尝试获取该属性。为此,我尝试在员工模型中编写自定义注入(inject)器,如下所示:
[Table("Person")]
public abstract class Person:ConventionInjection
{
public Person()
{
this.PersonAddresses = new List<PersonAddress>();
this.PersonEmails = new List<PersonEmail>();
this.PersonPhones = new List<PersonPhone>();
}
[Key]
public int PersonId { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
//public virtual Employee Employee { get; set; }
protected override bool Match(ConventionInfo c)
{
throw new NotImplementedException();
}
public List<PersonAddress> PersonAddresses { get; set; }
public List<PersonEmail> PersonEmails { get; set; }
public List<PersonPhone> PersonPhones { get; set; }
}
public class Employee:Person
{
public Employee()
{
this.Identifications=new List<Identification>();
this.BankAccounts=new List<BankAccount>();
}
public DateTime? DateOfBirth { get; set; }
//Other properties are inherited from Person abstract class
public virtual ICollection<Identification> Identifications { get; set; }
public virtual ICollection<BankAccount> BankAccounts { get; set; }
protected override bool Match(ConventionInfo c)
{
if (c.TargetProp.Name == "FullName")
{
return false;
}
var isMatch = (c.SourceProp.Name == "PersonId" && c.TargetProp.Name == "EmployeeId") ||
(c.SourceProp.Name == c.TargetProp.Name && c.SourceProp.Type == c.TargetProp.Type);
return isMatch;
}
}
尽管如此,我还是不断遇到上述相同的错误。
我还找到了另一个解决方案,它说要覆盖 LoopValueInjection 的 UseSourceProp 方法。
http://valueinjecter.codeplex.com/discussions/234706
但是,这在我的场景中并不那么容易,因为我已经在我的基类和派生类中继承了一个类。并且实现自定义值注入(inject)器也是不可能的,正如您从 EmployeeVm View 模型中看到的那样。
this.InjectFrom<Employee>(employee);
如果有人可以帮助我实现此实现或有任何其他解决方案,我将不胜感激。
另外,感谢观众。
最佳答案
试试这个:
在 EmployeeVm 的构造函数中:
public EmployeeVm(Employee employee)
{
this.InjectFrom<Employee>(employee);
stringBuilder = new StringBuilder();
stringBuilder.Append("<b>");
stringBuilder.Append(LastName.ToUpper());
stringBuilder.Append("</b>");
if (!string.IsNullOrEmpty(MiddleName))
{
stringBuilder.Append(", ");
stringBuilder.Append(MiddleName);
}
stringBuilder.Append(", ");
stringBuilder.Append(FirstName);
this.FullName = stringBuilder.ToString();
}
将 FullName 属性转换为自动属性:
public string FullName { get; set; }
此外,将 Employee 中的覆盖方法更改为:
protected override bool Match(ConventionInfo c)
{
var isMatch = (c.SourceProp.Name == "PersonId" && c.TargetProp.Name == "EmployeeId") ||(c.SourceProp.Name == c.TargetProp.Name && c.SourceProp.Type == c.TargetProp.Type);
return isMatch;
}
您不需要覆盖 LoopValueInjector 的 match 属性或 useSourceProp。 match 用于返回源属性和目标属性是否匹配,useSourceProp 用于忽略 SourceProperty,使其不映射到目标属性。
在您的场景中,源属性没有全名属性,关于匹配您不必说,就好像名称不匹配一样,它不会映射该属性。
错误是由于
LastName.ToUpper()
它试图在分配值之前将 LastName 属性转换为 upper。所以,如果你在valueinjector设置值后在构造函数中设置值,问题应该就解决了。
关于c# - 在 TPT 继承项目中使用 valueinjector 在 View 模型中自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20613883/
在我的项目中,我使用 TPT 作为测试环境,我们使用基于模型的测试。代码覆盖率通常在 80% 左右。但是客户要求100%的覆盖率,所以想用.c和.h文件进行测试。 我是这类测试的新手,因为我们只进行了
我首先使用代码,然后使用 TPT 继承。正在生成实体的基本类型表,但其主键上没有标识。 (如果有帮助,我可以发布代码)我的个人表有一个主键,但没有“是身份”。子类表按预期生成。 由于它没有为基本类型生
我正在编写一个使用继承的应用程序,我试图将其映射到具有 TPT 结构的 SQL Server 数据库。 但是,出于某种原因,EF 在父类(super class)表和子类表中生成了重复的外键。 我有这
我在我的数据库中创建了大量的表,以下是有问题的表: Table Name -Item ItemID - PK (Auto Increment) Title Table N
我正在尝试使用 TPT java api 来实现项目的一些自动化。 并尝试使用函数“generateTestCasesFromTestData”“添加步骤列表”但无法弄清楚从哪里获取其第一个参数“Sc
如何确定具有 TPT 继承的实体的子类型? 如果我有一个基类 Person 和两个子类 Manager 和 Customer,应该可以查询所有的人,然后通过使用 GetType 方法按他们的子类分组,
我有一个带有 TPT 继承映射的项目,现在我需要给它添加一个搜索功能,以便在多个表中查找记录。这就是我目前拥有的: public abstract class Customer { publi
我们正在使用 C# MVC .NET4。 EF5(代码优先)。 我们正在尝试构建一个系统,该系统应动态允许用户将额外属性“附加”到任何实体。 假设我们有 ProductClass 和 Products
我的域实体正在使用 EF Table Per Type Inheritance,这是关系。 如您所见,发票位于父实体 Order.cs 上。这让我现在在处理发票时遇到问题。 例如,要创建发票,我需要将
我有这个数据库结构: 服务 Id 整数 PK CategoryId FK 一些其他领域 本地化服务 LocalizedServiceId 公钥 LanguageId FK 姓名 描述 如您所见,我有一
我将 EF 与代码优先和 TPT(每个类型的表)继承结合使用。我有以下模型: public partial class AccountHolder { public int AccountHo
概览 我首先使用实体框架 4.3 代码和流畅的界面来设置我的 DbContext。我有一个基 Item 类,其中包含继承它的其他类型,例如 Event、BlogPost、ForumThread、W
在 Entity Framework 的早期版本中,在使用 Table per Type 继承时存在一些严重的性能问题,如下所述: http://www.codeproject.com/Article
考虑以下具有 TPT 继承的 Entity Framework 模型。 数据库表: Person (PersonID, Name) Student (PersonID, Grade) EF 实体: P
我试图达到的是使用 TPT 继承的 AbstractUser 和 Plant 之间的 NM 关系。 当我尝试配置关系时, modelBuilder.Entity().HasMany(c => c.Re
我们的系统正在接收来自两个外部来源的输入(电话/网络提交)。 // Table-Per-Type Hierarchy public class Submission { public int
我有一个关于 TPT + EF6 的大问题。 在我的数据库模型中,我有一张表 Person(我的应用程序中人员的基本信息),并且我有用于 Supplier 和 Consumer 的表. 我的类(cla
我想在 EF 中实现以下模型作为 TPT 设计。 我的代码如下: 基础型号 public abstract class Product { public int Id { get; set;
这个问题会围绕Account、IndividualAccount、Doctor这3个class进行说明: 前两个类是抽象的 IndividualAccount 是 Account 的子类 Doctor
针对遗留数据库使用 Entity Framework 4.1,我无法生成工作的 TPT 继承模型集,这些模型没有复数化并且对公共(public)主键使用不同的名称。 我正在使用数据库表 Organiz
我是一名优秀的程序员,十分优秀!