从数据库上传模型时丢失数据附件



我有一个大数据库现有数据库要通信,我首先使用EF 5.0数据库,我遇到的问题是,如果我在类上创建任何像[stringlength(50)]这样的数据装饰,然后上传数据库,当我"从数据库上传"时,所有数据注释都不见了。我该怎么办才能留住它们?

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

但是,您可以通过扩展模型来实现所需的功能。假设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; }
    }
}

并且您希望做一些变通措施来保留您的数据注释和属性。因此,请遵循以下步骤:

首先,添加两个类,其中一些是where(无论您想在哪里,但最好在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生成的类必须相同。

经历了这些,你的属性就再也不会丢失了。。。

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

我在一个.NET Runtime GitHub线程中发现了对我有用的东西,我推测这是一位.NET开发人员提出的。

基本上,这是一个错误,您必须强制模型使用TypeDescriptor.AddProviderTransparent来识别元数据装饰。

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

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

这是链接。我只做了一半,在.zip文件中有一个工作代码示例。

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

相关内容

  • 没有找到相关文章

最新更新