EF Core 2.1.1在实体实现某些特定接口时如何忽略某些属性

时间:2018-09-24 09:08:44

标签: c# .net entity-framework-core

具有此界面:

import UIKit
import WebKit
import Firebase
import FirebaseDatabase

class AdvisorConnectViewController: UIViewController, UIWebViewDelegate  {

@IBOutlet weak var connectView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()
    let url = URL(string: "https://www.google.com")
    connectView.loadRequest(URLRequest(url: NSURL(string:"https://www.google.com")! as URL))
    //connectView.load(URLRequest(url: url!))

    func webView(webView: UIWebView, shouldStartLoadWithRequest: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if navigationType == UIWebViewNavigationType.linkClicked {
            print("Hey Hey Hey")
        }
        print("Hey")
        return true
    }
}
}

和许多实现该接口的实体

public interface INotPersistingProperties
{
   string MyNotPersistingPropertyA { get; set; }
   string MyNotPersistingPropertyB  { get; set; }
}

对于实现INotPersistingProperties的所有实体,是否有机会自动忽略那些属性(使用Fluent API)?

4 个答案:

答案 0 :(得分:2)

当前EF Core没有提供定义自定义约定的方法,但是您可以将以下内容添加到OnModelCreating覆盖中(在发现所有实体类型之后),以迭代实现接口的所有实体类型并调用{{ 1}}每个属性的流利API:

Ignore

答案 1 :(得分:1)

您可以在模型类的此类属性上使用NotMapped属性。

或者您可以使用如下所示的DBContext类的OnModelCreating方法中的反射来忽略属性。

foreach(var property in typeof(INotPersistingProperties).GetProperties())
    modelBuilder.Types().Configure(m => m.Ignore(property.Name));

答案 2 :(得分:0)

您可以将NotMapped放在界面的属性中,然后使用MetadataType attribute

public interface INotPersistingProperties
{
   [NotMapped]
   string MyNotPersistingPropertyA { get; set; }
   [NotMapped]
   string MyNotPersistingPropertyB  { get; set; }
}

[MetadataType(typeof(INotPersistingProperties))]
public class MyEntity : INotPersistingProperties
{
  public int Id { get; set; }
  public string MyNotPersistingPropertyA { get; set; }
  public string MyNotPersistingPropertyB { get; set; }
}

或者您可以创建基类并将属性NotMapped放在属性中

答案 3 :(得分:0)

要忽略EF Core特定接口的所有类,我使用了以下代码:

protected override void OnModelCreating(ModelBuilder builder)
        {

         var multitenantTypes = typeof(IMultiTenantEntity)
            .Assembly
            .GetTypes()
            .Where(x => typeof(IMultiTenantEntity).IsAssignableFrom(x))
            .ToArray();

        foreach (var typeToIgnore in multitenantTypes)
        {
            builder.Ignore(typeToIgnore);
        }

    }