这是一个老问题。为了解决这个问题,我停用了 EDMX 代码生成并创建了外部 TT 文件来生成: DomainLayer:包含 EF EDMX 类(带导航)
DataLayer : 包含查询数据的东西
[Serializable]
public partial class Contact : _DomainLayer_Base
{
#region Primitive Properties
/// <summary>
/// Gets or sets Id.
/// </summary>
/// <value>The Id.</value>
public virtual int Id
{
get;
set;
}
/// <summary>
/// Gets or sets FK_Language.
/// </summary>
/// <value>The FK_Language.</value>
/// <remarks>
/// Foregn key of Contact
///
/// </remarks>
public virtual int FK_Language
{
get { return _fK_Language; }
set
{
try
{
_settingFK = true;
if (_fK_Language != value)
{
if (Language != null && Language.Id != value)
{
Language = null;
}
_fK_Language = value;
}
}
finally
{
_settingFK = false;
}
}
}
}
MetaDataLayer:包含 EF 独立类,数据注释链接到资源(无导航)
[Serializable]
public partial class Contact_MetaData : _MetaDataLayer_Base
{
[Display(Name = "Ety_Contact_Id" , ResourceType = typeof(InnovaApp.Layers.ResourcesLayer.Properties.MetaDataResources))]
[Required(ErrorMessageResourceName = "ErrMsgRequired",ErrorMessageResourceType = typeof(InnovaApp.Layers.ResourcesLayer.Properties.Resources))]
public virtual int Id
{
get;
set;
}
[Display(Name = "Ety_Contact_FK_Language" , ResourceType = typeof(InnovaApp.Layers.ResourcesLayer.Properties.MetaDataResources))]
[Required(ErrorMessageResourceName = "ErrMsgRequired",ErrorMessageResourceType = typeof(InnovaApp.Layers.ResourcesLayer.Properties.Resources))]
public virtual int FK_Language
{
get;
set;
}
MetaModels :在门户内部,MetaModels 是 MetaData 成员容器。它们包含门户所需的数据。示例:如果您有外键,则 ForeignKey 值将在 MetaData 中,但用于填充查找的 ListItems 将在 MetaModel 中。EntityLayer:包含 EF EDMX
当我创建一个 EF 查询时,我在结果前面加上 db :
当我在视图中使用数据时,我使用我的 MetaDataLayer :
public class ContactViewer_MetaModel : Contact_MetaData
要将数据从 DomainLayer 传输到 MetaDataLayer,我使用 Emit Mapper,因为我的 TT 文件保证 Domain 和 MetaData 之间的签名相同。
toReturn = ObjectMapperManager.DefaultInstance.GetMapper<Contact, ContactViewer_MetaModel>().Map(dbContact);
在视图中:
@model InnovaApp.Layers.SecurityLayer.Models.MetaModels.Contact_MetaModel
@Html.HiddenFor(m => m.Id)
<ol class="olMainForm">
<li>
@Html.LabelFor(m => m.FK_Genre)
@Html.DropDownListFor(m => m.FK_Genre, Model.Genres)
@Html.ValidationMessageFor(m => m.FK_Genre)
</li>
</ol>
你可以在这里找到完整的源代码:
https://myprettycms.codeplex.com