前言2015年2月如果您仍在使用Entity Framework EDMX,请使用Entity Framework Code First代替您自己帮忙和结帐.不同之处在于您的表是从模型类创建的,而不是在使用表创建模型类的EDMX中创建的.这是一个全面的解决方案,这个问题中的问题甚至都不存在!
我有一个现有的SQL数据库,我正在使用ADO.NET Enity Data Model作为模型.我正在尝试在我的MVC应用程序中构建一些CRUD功能.
在我找到的关于这个主题的所有教程中,他们从头开始构建模型并将属性添加到模型类中.例如:
[Required]
[StringLength(10)]
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
但是,模型类是自动生成的,所以我认为更改它们是一个坏主意(如果刷新数据库模型,无论如何都会写入).
我如何添加验证属性?
我在我的域模型类上使用MetaDataType属性.它应该将属性信息从引用的类移动到已设置MetadataType属性的类中.但它没有像宣传的那样做.造成这个问题的原因是什么?
[MetadataType(typeof(ComponentModelMetaData))]
public partial class Component
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Repo> Repos { get; set; }
public string Description { get; set; }
}
public class ComponentModelMetaData
{
[Required(ErrorMessage = "Name is required.")]
[StringLength(30, MinimumLength = 3, ErrorMessage = "Name length should be more than 3 symbols.")]
public string Name { get; set; }
public ICollection<Repo> Repos { get; set; }
[Required(ErrorMessage = "Description is required.")]
public string …Run Code Online (Sandbox Code Playgroud) 伙计我和同一个类有一对多关系叫做user,
我在web apis get方法中返回一个用户实例,只要我没有任何方法就可以正常工作
User
ID | Name
0 | A
1 | B
Friends Table ( This table is used to build the one to many relationship )
User_ID | Friend_ID
1 | 0
0 | 1
Run Code Online (Sandbox Code Playgroud)
这是我的GetMethod
[HttpGet]
public Models.User Authenticate()
{
try
{
return db.Users.SingleOrDefault(x => x.ID == 0 ) ;
}
catch
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我得到并返回一个用户实体,那么我得到了打击错误
任何人都可以帮我解决以下错误吗?
{"Message":"发生错误.","ExceptionMessage":"'ObjectContent`1'类型无法序列化内容类型'text/html; charset = utf-8'的响应正文.","ExceptionType ":"System.InvalidOperationException","StackTrace":null,"InnerException":{"消息":"发生错误.","ExceptionMessage":"使用类型'System.Data.Entity.DynamicProxies检测到自引用循环.Friend_E5C79F4736EB2750392FFC7061B18E9C12F15F9583409603C75C5D1B1F7358D4'.路径'Friends1 [0] .User.Friends'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer,IWrappedCollection值,JsonArrayContract契约,JsonProperty成员,JsonContainerContract collectionContract,CheckForCircularReference(JsonWriter writer,Object value,JsonProperty属性,JsonContract contract,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \n) …
在我的Entity Framework v4项目中,我有一个包含两列的表,这些列由数据库计算(通过触发器等).为了让EF正确地将记录插入到表中,我必须在EF存储模型(StoreGeneratedPattern属性)中手动将列标记为"已计算",这是设计者不支持的 - 所以我必须制作手动编辑.EDMX文件中的XML.
问题是,每当我的数据库架构发生变化,并且我需要更新项目中的存储模型时,"更新模型向导"将覆盖.EDMX的整个存储模型部分,从而消除了我的手动更改.这意味着我必须保留这些更改的特殊列表,并在每次更新时手动重新应用它们!对于上帝的爱,这必须是EF中最愚蠢的故障之一.
无论如何,我对蜂巢的问题是这样的...有没有办法阻止存储模型覆盖?有没有办法标记数据库中的列,以便EF会自动将它们标记为计算?作为最后的手段,是否有一些非常简单的XML工具/技术可以在每次刷新后自动为我应用更改?
谢谢,哦,我学习StackOverflow贡献者,以缓解我的痛苦,并帮助我解决这个问题,即使我还没有在网站上的任何状态.总有一天,当我有4位数的声望时,我会记住你.
布赖恩
更新
内部人员告诉我,一个解决方案可能是查看"Designer Power Pack"(下面的链接),它允许您自定义存储模型的生成.到目前为止,我只是略读了这些信息,但在我看来,可能会有一两天的学习曲线来解决这个问题.有没有人对Designer Power Pack或任何其他想法有任何经验?
再次感谢,Brian
假设我有一个名为1的数据库Products.因此,我将通过Db First方法在VS 2012中创建一个带有pluralize and singularize选项的EF模型.
因此,模型Product为我创建了一个实体,默认命名约定将此实体映射到dbo.Products表.
现在我想改变这种行为.实际上我想创建一个自定义约定来将ProductModel实体映射到dbo.Products表.
这可能吗?!如果是这样,怎么样?
更新:我的目标是......
如您所知,每当您从数据库更新模型时,如果它导致模型发生更改,则自动生成的实体将被覆盖.
另一方面,我想将数据注释属性添加到实体属性,以便我可以使用它们来塑造我的视图,并希望简单地使用我的DbContext,如下面的插入:
public ActionResult Create(Product product)
{
if (ModelState.IsValid)
{
db.Products.Add(product);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(product);
}
Run Code Online (Sandbox Code Playgroud)
问题是我的应用程序分析没有完成,数据库更改次数.因此,我需要从数据库更新模型,之后,我的所有属性都将被删除.
所以我决定创建一个ProductModel类并将Product代码复制到它,并将视图作为视图模型传递给它.然后,当我想查询我的数据库时,我会得到一个异常,它说该dbo.ProductModels名称在db中不存在...
提前致谢
entity-framework naming-conventions asp.net-mvc-4 entity-framework-5
有谁知道如何在OData V4的metatdata中设置/读取基于词汇的注释来定义最大字符串长度之类的内容?
有一篇文章“ 客户端注释支持”,但没有显示任何示例代码,我不确定100%是否他们甚至在谈论数据注释。
它具有如下代码:
var person = dsc.People.ByKey("russellwhyte").GetValue();
// Try to get an annotation for a property
dsc.TryGetAnnotation<Func<ObservableCollection<string>>, string>(() => person.Emails, fullQualifiedTermName, qualifier, out annotation);
Run Code Online (Sandbox Code Playgroud)
但是它没有解释“ fullQualifiedTermName”或“ qualifier”使用什么。
我添加了“ odata.inculde-annotations = *”,但这似乎无济于事。
我也尝试了以下方法。
dsc.TryGetAnnotation<Func<string>, string>(() => person.FirstName, "System.ComponentModel.DataAnnotations", out annotation);
Run Code Online (Sandbox Code Playgroud)
但这只会返回null。
我从2012年开始在WCF数据服务中找到了“ 词汇表”,其中谈到了对验证元数据的支持。
我要试一下。
我希望在OData V4中有一种简单/更好的方法可以做到这一点。
Update 1
WCF词汇表示例在OData V4中不起作用,因为System.Web.Http.HttpConfiguration中缺少config.AnnotationsBuilder。
OData V4支持此处http://www.odata.org/vocabularies/所定义的词汇表,甚至还提供了我需要的“元数据注释可以为特定属性定义有效值范围”,但是似乎没有任何示例代码除了SAP https://blogs.sap.com/2013/10/07/vocabulary-based-annotations/之外的任何其他文章。
更新2
在查看TripPinService之后,我注意到它们在预算上有一些注释,如下所示。
<Property Name="Budget" Type="Edm.Single" Nullable="false">
<Annotation Term="Org.OData.Measures.V1.ISOCurrency" String="USD"/>
<Annotation Term="Org.OData.Measures.V1.Scale" Int="2"/>
</Property>
Run Code Online (Sandbox Code Playgroud)
幸运的是,该项目的源代码是ODataSamples TripPin。
在查看了服务之后,我发现我首先必须创建自己的xml词汇表文件。(ValidationVocabularies.xml) …
wcf-data-services odata data-annotations asp.net-web-api2 odata-v4
我对数据库优先模型以及如何使用 MVC 视图模型处理这些模型几乎没有经验。
很明显,我无法更改原始模型,但我想为模型添加一些注释以进行验证。
因此,我试图做的是创建一个从实体继承的 ViewModel
我的 DB First 生成的模型 - 不要修改
public partial class xmldata
{
public string ISBN { get; set; }
public string title { get; set; }
public string blurb { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个视图模型,如下所示,它继承自 xmldata
public class XmlDataViewModel : xmldata
{
[AllowHtml]
[Display(Name = "Blurb")]
public string BlurbVm {
get { return blurb; }
set { blurb = value; }
}
...
}
Run Code Online (Sandbox Code Playgroud)
上面显示的字段我需要 AllowHtml 和我迄今为止最好的解决方案,但是在控制器操作中,我仍然必须手动将 BlurbVm 字段映射回模糊,即使我认为上面的 setter 会处理它(我使用 Automapper对于其他领域)所以我很困惑为什么这不起作用。
此外,目前我正在控制器中进行验证,并且可能希望稍后对其进行重构以将它们移动到视图模型中,以便我可以使用 [Required] …
c# ×2
.net ×1
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
json ×1
odata ×1
odata-v4 ×1
sql ×1
sql-server ×1