簡體   English   中英

從EF6自動生成的類以實現自定義界面

[英]Auto-generated class from EF6 to implement custom interface

我正在使用EF6。我在db中有一個表,為其自動生成的類如下所示:

public partial class tblPreparation
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public tblPreparation()
    {
        this.tblPreparationItem = new HashSet<tblPreparationItem>();
    }

    public int id { get; set; }
    public string name { get; set; }
    public System.DateTime date { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<tblPreparationItem> tblPreparationItem { get; set; }
}

在我的代碼中,我希望此類擴展另一個類EntityObject,該類位於名稱空間System.Data.Entity.Core.Objects.DataClasses中(並實現另一個接口)。 所以我創建了寫這個局部類:

public partial class tblPreparation : EntityObject, IMyInterface
{

}

它不會引發語法錯誤,但在運行應用程序時會出現運行時錯誤:“未映射類型'tblPreparation'。請使用Ignore方法或NotMappedAttribute數據批注檢查該類型是否未明確排除。該類型被定義為類,不是原始類型或泛型類型,並且不繼承自EntityObject。” 我想念什么?

我猜想是因為它們不在同一個命名空間中。 有沒有辦法解決這個問題?

我可能會誤解了您對名稱空間的評論,但為清楚起見,Partial類實際上是位於對應部分類的相同名稱空間中的部分類,否則您只是兩個單獨的具有相同名稱的單個類自稱是偏愛的。 在這種情況下,修復很簡單。 將它們放在相同的名稱空間中。

但是,更可能是由於將EntityObject添加到類層次結構中,如oerkelens所述。 EF 6創建POCO的代理,因此,您的類必須具有無參數的構造函數。 添加另一個類可能會阻止db上下文創建對象的代理。

從層次結構中僅刪除該類,檢查是否可以實現這些實體以進行驗證或排除。

編輯 -不,這絕對是由於EntityObject

我通過首先讓我的實體在部分類中實現一些接口來重現此問題。 效果很好。 然后,我從EntityObject繼承了部分類,但由於您的錯誤而失敗。

重現此錯誤后,我創建了一個名為MyStupidClass的類,並用MyStupidClass替換了EntityObject ,我仍然可以實現實體(即使具有EntityObject的頂級屬性)。

因此,這取決於您引入層次結構的類。

class Program
{
    static void Main(string[] args)
    {
        using (var db = new schedulerEntities())
        {
            var schedules = db.Schedules.ToArray();
            foreach (var schedule in schedules)
            {
                Console.WriteLine($"{schedule.Cron} - {schedule.FriendlyDescription}");
            }
        }
        Console.ReadLine();
    }

}
public partial class Schedule: MyStupidClass, IScheduler
{
    public string FirstName { get; set; }
}

public class MyStupidClass
{
    public EntityKey EntityKey { get; set; }
    public EntityState State { get; set; }
}

interface IScheduler
{
    long Id { get; set; }
    string Name { get; set; }
    string Cron { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM