我已经覆盖了控制器一代T4模板(ControllerWithContext.tt)所描述的在这里.
我想利用EF.utility.CS.ttincludePOCO模型生成器T4模板中使用的代码帮助程序实用程序.因此我将以下几行复制Model.tt到我的ControllerWithContext.tt.
<#@ include file="EF.Utility.CS.ttinclude"#>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试添加控制器时,我收到错误消息
加载包含文件'EF.utility.CS.ttinclude'返回null或空字符串
根据MSDN文档,此错误是因为包含的文件是空白的,显然不是因为它可以使用Model.tt
我能看到的唯一区别是被覆盖的ControllerWithContext.tt没有定义自定义工具,而Model.tt它被设置为TextTemplatingFileGenerator.
我的解决方法是将我需要的功能复制ef.utility.cs.ttinclude到my中ControllerWithContext.tt,这本身就会产生更多错误,但很容易解决.
如何在未定义自定义工具的情况下包含T4模板?
我注意到以下行为,我想知道是否有人可以解释它为什么会发生以及如何防止它.
在我的部分类中,我添加了数据库中不存在的各种只读属性.创建对象时,在访问控制器的Create方法之前访问这些属性.但是,get; set;不会访问使用just声明的属性.
使用非常简单的示例详细说明,如果我有以下属性:
public bool getBoolProperty {
get {
return true;
}
}
public bool getSetBoolProperty {
get; set;
}
Run Code Online (Sandbox Code Playgroud)
如果我然后在属性上放置断点,则在创建对象时,将针对第一个属性而不是第二个属性触发断点.但是,如果我有一个方法:
public bool getBoolProperty() {
return true;
}
Run Code Online (Sandbox Code Playgroud)
那么这是不被访问的.
我尝试了各种各样的变化和注释
// empty set
public bool getBoolProperty {
get {
return true;
}
set {}
}
// not mapped attribute
[NotMapped]
public bool getBoolProperty {
get {
return true;
}
}
// getting private variable
private bool _boolProperty = true;
public bool getPrivateBoolProperty {
get {
return _boolProperty; …Run Code Online (Sandbox Code Playgroud) 我的场景我正在使用带有Entity Framework 4.1的Visual Studio 2010我有一个包含许多表和许多存储过程的遗留数据库.我正在使用MVC 3编写ASP.NET C#程序
我已经使用ADO.NET DbContext采用了"数据库优先"设计,所以我有一个edmx,它可以很好地设置所有模型和关联以及导航属性.我可以将插入,更新,删除程序映射到相关模型.我使用'Function Import'导入其他存储过程.但是,我找不到一种方法来映射我的Select过程来选择动作(按id选择,选择列表,按过滤器选择等).
EF似乎使用延迟加载,所以我想要发生的是当一个对象获取其子对象时,它使用已经编写的存储过程.(选择过程考虑'IsDeleted'标志,并使用'ORDER BY'条款等等)
我从本文 http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx 看到Linq to SQL允许拖放SP,听起来或多或少,正是我想要的.
我也遇到了术语DefiningQuery. http://msdn.microsoft.com/en-us/library/cc982038.aspx 这就是我想要的吗?我不喜欢这样的说明'当您运行更新模型向导时,对存储模型所做的任何更改(包括定义查询)都将被覆盖.
总之,我想要发生的是当一个对象获取其子对象时它使用我的存储过程.
我可以使用Entity Framework实现我的目标吗?我错过了一些明显的事吗?
或者我应该尝试变得非常聪明并修改db Entity T4模板,例如,我生成的Address模型具有以下属性:
public virtual ICollection<AddressLine> AddressLines {
get{
DBWrapper _db = new DBWrapper();
return _db.GetAddressLines(AddressID);
}
set{};
}
Run Code Online (Sandbox Code Playgroud)
其中GetAddressLines是调用函数导入的自定义函数,并执行必要的转换.
我有一个具有单个子实体和各种其他属性的视图模型.
在我看来,我想显示子实体的表单.使用以下代码:
@Html.HiddenFor(model => model.Item.ItemID)
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
<input id="Item_ItemID" name="Item.ItemID" type="hidden" value="234" />
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Html帮助器已经为id和name属性添加了前缀,而我希望输出为
<input id="ItemID" name="ItemID" type="hidden" value="234" />
Run Code Online (Sandbox Code Playgroud)
因此,前一个输出在提交表单时会导致错误,因为表单元素与子实体上的属性不对应.
我知道我可以通过对隐藏字段进行硬编码来解决这个问题
<input id="ItemID" name="ItemID" type="hidden" value="@Model.Item.ItemID" />
Run Code Online (Sandbox Code Playgroud)
哪种方式会破坏拥有Html帮助程序的原因,或者创建局部视图并传入子对象
@{Html.RenderPartial("ItemForm", Model.Item);}
Run Code Online (Sandbox Code Playgroud)
我知道能够将html属性传递给方法,并且还编写自己的扩展方法,但是当涉及数据验证和jQuery时,事情变得更加复杂,即以下代码:
@Html.EditorFor(model => model.Item.Title)
@Html.ValidationMessageFor(model => model.Item.Title)
Run Code Online (Sandbox Code Playgroud)
生成此代码:
<input class="text-box single-line" data-val="true" data-val-required="The Title field is required." id="Item_Title" name="Item.Title" type="text" value="Some text" />
<span class="field-validation-valid" data-valmsg-for="Item.Title" data-valmsg-replace="true"></span>
Run Code Online (Sandbox Code Playgroud)
所以需要一个优雅的方法来保持属性名称同步.
那么任何人都可以回答为什么HtmlHelper为视图模型的子项添加前缀到属性?作为一个后续问题,还有其他任何防止添加前缀的巧妙方法吗?