7

我有一个大型数据库现有数据库要与之通信,并且我首先使用 EF 5.0 数据库,我遇到的问题是,如果我[stringlength(50)]在类上创建任何数据装饰,然后上传数据库,当我“上传从数据库”所有数据注释都消失了。我该怎么做才能保留它们?

4

2 回答 2

12

这很简单:你不能!因为这些代码是自动生成的,并且会在每次模型更新或更改时被覆盖。

但是,您可以通过扩展模型来实现您所需要的。假设 EF 为您生成了以下实体类:

namespace YourSolution
{
    using System;
    using System.Collections.Generic;

    public partial class News
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }        
        public int UserID { get; set; }

        public virtual UserProfile User{ get; set; }
    }
}

并且您想要做一些工作来保留您的数据注释和属性。因此,请按照以下步骤操作:

首先,在某个地方(无论你想要什么,但最好是在Models)添加两个类,如下所示:

namespace YourSolution
{
    [MetadataType(typeof(NewsAttribs))]
    public partial class News
    {
         // leave it empty.
    }

    public class NewsAttribs
    {            
        // Your attribs will come here.
    }
}

然后将您想要的属性和属性添加到第二类 -NewsAttribs这里。:

public class NewsAttrib
{
    [Display(Name = "News title")]
    [Required(ErrorMessage = "Please enter the news title.")]
    public string Title { get; set; }

    // and other properties you want...
}

笔记:

1)生成的实体类的命名空间和你的类必须相同——这里YourSolution

2)您的第一个类必须partial并且其名称必须与 EF 生成的类相同。

经历这个,你的属性再也不会丢失了......

于 2013-07-20T12:34:27.197 回答
0

接受的答案可能适用于标准数据操作,但我试图在调用DbSet.Addusing之前验证模型TryValidateObject。有了公认的答案,它仍然没有接受数据注释。

我在 .NET 运行时 GitHub 线程中发现了对我有用的东西,正如我所推断的那样,是 .NET 开发人员之一。

基本上,这是一个错误,您必须强制模型使用TypeDescriptor.AddProviderTransparent. . .

TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(News), typeof(NewsAttrib)), typeof(News));

一旦我进行此调用,TryValidateObject识别数据注释并false在不满足任何约束时返回。

这是链接。我走了一半多一点,.zip 文件中有一个工作代码示例。

https://github.com/dotnet/runtime/issues/46678

于 2022-02-15T15:33:57.153 回答