- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一生都无法使用现有的代码,但是我正在尝试将enum
选择保存为NHibernate中的字符串。基本上,我有一个UI复选框,如果用户选择了多个复选框,我想存储这些选择。现在,我可以让NHibernate存储一个选择(例如,从下拉列表或单选按钮列表中,其中用户仅限于一个选择)。
这是我列举的内容的精髓:
public enum IncomeType
{
[Display(Name = "Full-Time Employment")]
FullTime,
[Display(Name = "Part-Time Employment")]
PartTime,
[Display(Name = "Self-Employment")]
SelfEmployed,
[Display(Name = "Rental")]
Rental,
[Display(Name = "Social Security Payments")]
SocialSecurity,
[Display(Name = "Retirement / Pension Payments")]
Retirement,
[Display(Name = "Child Support Payments")]
ChildSupport,
[Display(Name = "Spousal Maintenance")]
Maintenance,
[Display(Name = "Other")]
Other
}
我使用一种方法来“选择”是否显示复选框列表(如果我的
BulkItemThreshold
等于选项数,则会显示一个复选框列表)。这是该方法:
public static IEnumerable<SelectListItem> GetItemsFromEnumString<T>
(T selectedValue = default(T)) where T : struct
{
return from name in Enum.GetNames(typeof(T))
let enumValue = Convert.ToString((T)Enum.Parse(typeof(T), name, true))
select new SelectListItem
{
Text = GetEnumDescription(name, typeof(T)),
Value = enumValue,
Selected = enumValue.Equals(selectedValue)
};
}
(注意:其中有些项目有助手,但我不认为它们是相关的;而且,所选输入是使用模板
.cshtml
文件显示的-再次不确定是否相关)
public class IncomeTypeSelectorAttribute : SelectorAttribute
{
public override IEnumerable<SelectListItem> GetItems()
{
return Selector.GetItemsFromEnumString<IncomeType>();
}
}
最后,我们进入
virtual
属性(使用代理),但这是NHibernate扔扳手的地方(注意:在NHibernate之前,这对我来说很好用,现在我试图在不使用它的情况下获得许多代码行重新执行所有操作;如果重新执行所有操作,则可能会使我已经执行的代码增加三倍):
[IncomeTypeSelector(BulkSelectionThreshold = 9)]
public virtual List<string> IndividualIncomeTypeCheckBox { get; set; }
代理(部分):
public List<string> IndividualIncomeTypeCheckBox
{
get { return Record.IndividualIncomeTypeCheckBox; }
set { Record.IndividualIncomeTypeCheckBox = value; }
}
同样,这是我的工作方式,在NHibernate之前运行良好。但是现在我必须使用NHibernate。没有绕过它。
part.IndividualIncomeTypeCheckBox = record.IndividualIncomeTypeCheckBox;
如果这只是一个选择,那将起作用。
public virtual IncomeType? IndividualIncomeTypeCheckBox { get; set; }
如果执行上述操作,它将显示一个下拉列表,并且NHibernate将在数据库中存储用户选择的一个允许选项。但是
List<string>
的多个选项不起作用。
IList<IncomeType>
或其他某种变体。但是,如果我使用这个,那么NHibernate要求
IncomeType
是数据库中的另一个表。对于我认为如此简单的事情,这太多的代码无法编写。我们并不是在谈论多对多关系,因为这不是具有多个地址的用户(其中地址将具有街道,城市,州,邮政编码等)。
get
和
set
代码,但没有任何效果。我已经尝试过
[Flags]
和其他仅适用于
string
的东西,但无济于事。这些最后的解决方案将“起作用”,但仅保存从多个中选择的第一个项目(即,在我的方案中,如果用户选择“FullTime”和“Rental”作为收入类型,则只有“FullTime”(
string
)是已保存或为“1”(
[Flags]
/
int
),但未同时选择两项。
ReadOnly
属性重新显示选择,如下所示:
[IncomeTypeSelector]
[ReadOnly(true)]
public List<string> IndividualIncomeTypeCheckBoxPost
{
get { return IndividualIncomeTypeCheckBox; }
}
这将显示在UI上,但是我尝试使用NHibernate做类似的事情,但是它不起作用。
enum
吗?
[IncomeTypeSelector(BulkSelectionThreshold = 9)]
public virtual IList<IncomeTypeRecord> IndividualIncomeTypeCheckBox
{
get { return incomeType; }
set { incomeType= value; }
}
private IList<IncomeTypeRecord> incomeType =
new List<IncomeTypeRecord>();
代理(部分):
public IList<IncomeTypeRecord> IndividualIncomeTypeCheckBox
{
get { return Record.IndividualIncomeTypeCheckBox; }
set { Record.IndividualIncomeTypeCheckBox= value; }
}
并更改枚举:
public enum IncomeType : int // removing int & value still gives validate error
{
[Display(Name = "Full-Time Employment")]
FullTime = 1,
[Display(Name = "Part-Time Employment")]
PartTime,
....
}
我添加了此类以支持
IncomeTypeRecord
public class IncomeTypeRecord
{
public virtual int Id { get; set; }
public virtual IncomeType Value { get; set; }
}
但是,当我进入UI屏幕并选择一个或多个选项时,会收到验证错误(值无效)。例如,假设我单独选择FullTime,或选择FullTime和Retirement,则UI将显示以下错误:
The value 'FullTime' is invalid.
The value 'FullTime,Retirement' is invalid.
int
的
enum
声明并摆脱了以“1”开头的值,我仍然会收到此验证错误。我尝试弄乱并添加了不同的模型联编程序(现在让我感到困惑的是,我原来的问题是否仍然存在,而现在我又遇到了另一个问题-但您仍然会得到赏金:))。
public virtual string IndividualIncomeTypeCheckBox{ get; set; }
部分:
//If I do IEnumberable<string> my .Select throws a cast error
public IEnumerable<IncomeType> IndividualIncomeTypeCheckBox
{
get
{
return Record
.IndividualIncomeTypeCheckBox
.Split(',')
.Select(r => (IncomeType)Enum.Parse(typeof(IncomeType), r));
}
set { Record.IndividualIncomeTypeCheckBox= value
== null ? null : String.Join(",", value); }
}
服务等级:
public SimplePart CreateSimple(SimplePartRecord record)
{
SimplePart simple = Services.ContentManager.Create<SimplePart>("Simple");
...
//How I would save a FirstName property (example Part / PartRecord below)
//public virtual string FirstName { get; set; } - PartRecord
//public string FirstName - Part
//{
// get { return Record.FirstName ; }
// set { Record.FirstName= value; }
//}
simple.FirstName = record.FristName;
...
//I obviously cannot do the following with the above IncomeType
//Getting cannot convert string to IEnumerable error
//How would I write this:
simple.IndividualIncomeTypeCheckBox = record.IndividualIncomeTypeCheckBox;
...
}
这就是它在 Controller 中的调用方式(这一直存在于数据库中):
(更新 Controller 代码)
public ActionResult Confirm(string backButton, string nextButton)
{
if (backButton != null)
return RedirectToAction("WrapUp");
else if ((nextButton != null) && ModelState.IsValid)
{
_myService.CreateSimple(myData.SimplePartRecord);
return RedirectToAction("Submitted");
}
else
return View(myData);
}
使用其他代码(序列化和 View 模型)更新:
private MyViewModel myData;
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var serialized = Request.Form["myData"];
if (serialized != null)
{
myData = (MyViewModel)new MvcSerializer().Deserialize
(serialized, SerializationMode.Signed);
TryUpdateModel(myData);
}
else
myData = (MyViewModel)TempData["myData"] ?? new MyViewModel();
TempData.Keep();
}
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
if (filterContext.Result is RedirectToRouteResult)
TempData["myData"] = myData;
}
我使用序列化是因为我在前端设置了一个多步骤向导(如 Controller 操作“backButton”和“nextButton”所示),我没有使用驱动程序(只能显示Admin或在前端显示,但可以则仅在直接位于〜/ Views文件夹下的.cshtml文件上(而不是在我正在使用的结构化文件夹列表中)。没有驱动程序=没有更新 View 模型类型代码=没有在数据库中“创建”数据的机制。我不使用某些“创建”类型的方法,该表单将提交,但所有数据将为“NULL”。
[Serializabel]
public class MyViewModel
{
public SimplePartRecord SimplePartRecord { get; set; }
}
并且,以防万一,这是迁移的相关部分(返回1是完全独立且不相关的表):
public int UpdateFrom1()
{
SchemaBuilder.CreateTable("SimplePartRecord",
table => table
.ContentPartRecord()
...
.Column("IndividualIncomeTypeCheckBox", DbType.String)
...
);
ContentDefinitionManager.AlterPartDefinition("SimplePart",
part => part
.Attachable(false));
return 2;
}
我得到的错误是
Cannot implicitly convert type 'string' to 'System.Collections.Generic.IEnumerable'"
simple.IndividualIncomeTypeCheckBox = record.IndividualIncomeTypeCheckBox;
另外一个想法:我尝试使用n-n Relation示例处理这种情况。除了它之外,还有很多我认为应该简单明了的代码,由于我使用序列化的方式,我遇到了很多对象引用错误,并且无法弄清楚如何正确编码我的 Controller 来处理它。
最佳答案
问题是,如果不与中间关联表建立完整的关系,就无法映射List。使用记录将值存储为逗号分隔的字符串(因此您的record属性是一个字符串,而不是字符串列表)更加简单,并且您的部分可以在string和List之间来回映射。
您可以在此处找到非常接近的示例:
https://bitbucket.org/bleroy/nwazet.commerce/src/d722cbebea525203b22c445905c9f28d2af7db46/Models/ProductAttributesPartRecord.cs?at=default
https://bitbucket.org/bleroy/nwazet.commerce/src/d722cbebea525203b22c445905c9f28d2af7db46/Models/ProductAttributesPart.cs?at=default
它没有使用枚举值,而是一个ID列表,但这应该使您对如何使此工作相当简单有一个好主意:解析枚举您已经知道该怎么做。
让我知道您是否需要更多详细信息,但是我认为这是您畅通无阻的方法。
关于asp.net-mvc - 想要使用NHibernate将选定的(即多个)枚举保存为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288249/
我一直在为初学者阅读 nhibernate 3.0 并阅读了一些常见错误(我犯了一些错误) 我想知道将一个或多个记录设为只读有哪些策略。现在我取回所有行并循环遍历它们,使它们通过 session.Re
我们有一个使用 NHibernate 的相当健壮的系统,我们正在从单个数据库服务器迁移到拥有两台服务器,一台用于管理,另一台用于我们面向公众的网站。这主要是为了让我们可以使用不会影响当前站点的工作流来
我在尝试构建一个时遇到以下错误 session 工厂: PersistenceTests.Can_Map_Orders_To_Database : Failed System.IndexOutOfRa
如果客户有很多订单附加到他们。您将如何使用 NHibernate 延迟加载订单列表。 是不是需要设置映射文件?任何帮助或示例都会很棒。 最佳答案 Chris 的建议是我会怎么做,但是如果您想在运行时执
我正在尝试使用 HQL 对一个简单的查询进行分页,并将总行数作为同一查询的一部分进行检索。 我的查询很简单... var members = UnitOfWork.CurrentSession.Cre
我有旧版数据库,存储的日期表示无日期为9999-21-31, 列Till_Date的类型为DateTime not-null="true"。 在应用程序中,我要构建持久化类,将no-date表示为nu
您可以指定命名空间和程序集以使用 HBM 文件顶部的类型: 您可以在同一个映射文件中使用来自多个程序集/命名空间的类型,如果可以,这样做的语法是什么? 最佳答案 您可以从 HBM 文件的顶部删除默认
如何强制 NHibernate 在多对多集合上执行 RIGHT 外连接或 INNER 连接而不是 LEFT 外连接? 我想这样做的原因是因为过滤应用于集合元素。使用左连接,您将获得与未过滤查询相同的返
我们开始在我的工作场所使用NHibernate,包括从映射生成模式。我们的DBA想要的一件事是主键和外键关系的名称一致。我已经能够设置FK约束名称,但是在的文档中看,它似乎不存在命名主键约束的方法。
我需要NHibernate来执行这样的查询: SELECT * FROM Users ORDER BY Func(FirstName, LastName) Standart NHibernate Or
假设在一个实体中有属性 id、用户名、年龄、地址。现在我只想要 id 和 username 并使用此代码。 投影可以从查询中返回实体列表以外的内容。 var proj = Projections.Pr
我花了很长时间,但我终于让 nHibernate 的 Hello World 工作了。在我做了“延迟加载”之后它起作用了。老实说,我无法告诉您为什么这一切都有效,但确实如此,现在我正在阅读您不需要延迟
假设您有两个类,Person 和 Address。 Person 有一个对 Address 的引用,如下所示: public class Person { public virtual Addre
我在 NHibernate 引用文档 中阅读第 10 章“只读实体”如下: http://nhibernate.info/doc/nh/en/index.html#readonly 但不幸的是我不知道
有谁知道 NHibernate 是否支持从存储过程返回输出参数?我在文档中进行了搜索,但无法真正找到任何可以确认的内容。 最佳答案 我面临同样的问题。 NHibernate 不允许您以这种方式使用存储
简而言之,什么工作得更快: SessionFactory 预编译 XML 配置,或 流畅的NHibernate提供 以编程方式配置? 最佳答案 我个人的经验是,Configuration 对象的构建(
我的域类具有如下所示的集合: private List _foos = new List(); public virtual ReadOnlyCollection Foos { get { retur
当我有一个带有一对多子集合的实体对象时,我需要查询一个特定的子对象,是否有我还没有想出的功能或一些巧妙的模式来避免 NHibernate获取整个子集合? 例子: class Parent {
在我的域中,员工和部门具有一对多的双向关系;为了让子员工同步这个,我有一个“内部”访问字段,用于部门中员工的集合(NHibernate 的 Iesi),否则它将是只读公共(public)的。像这样:
我有一个 nhibernate 自定义类型,我想用 Fluent NHibernate 映射它。 HBM 映射如下所示。 Services.Data.DateConventionTyp
我是一名优秀的程序员,十分优秀!