难以仅在实体框架

时间:2015-06-02 21:26:41

标签: c# entity-framework

我很难弄清楚如何只将Entity Framework中的基类映射到我的数据库,同时防止有关继承它的类的任何信息被映射到数据库。

我创建了一个简单的示例来突出显示我的难度,其中有一个基类Worker类和一个名为Engineer的子类。出于某种原因,假设我不关心存储工程师的详细信息...我只希望我的数据库包含Worker类中的信息。

所以我做了以下事情:

class Program
{
    static void Main(string[] args)
    {
        Engineer e = new Engineer();
        e.Name = "George";
        e.Focus = "Software";

        MyDatabase db = new MyDatabase();
        e.Save(db);
    }
}

public class MyDatabase : DbContext
{
    public DbSet<Worker> Workers { get; set; } 
    public MyDatabase() : base("mytempdb") { }
}

[NotMapped]
public class Engineer : Worker
{
    public string Focus { get; set; }
}


public class Worker
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Name { get; set; }

    public bool Save(MyDatabase db)
    {
        try
        {
            if (db.Workers.Any(w => w.ID == this.ID))
            {
                db.Workers.Attach(this);
                db.Entry(this).State = System.Data.Entity.EntityState.Modified;
            }
            else
            {
                db.Workers.Add((Worker)this);
            }
            db.SaveChanges();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return false;
        }

        return true;
    }
}

我正在做“数据库优先”设计,我的数据库表看起来像:

CREATE TABLE [dbo].Workers
(
    [ID] INT NOT NULL PRIMARY KEY, 
    [Name] NVARCHAR(200) NULL, 
    [Discriminator] NVARCHAR(200) NULL
)

然而,当我运行我的程序时,它仍然在寻找一个存储Engineer的实体。我告诉它不要映射它,希望它只将基类映射到数据库:

  

System.InvalidOperationException:无法找到EntityType'ConsoleApplication10.Engineer'的映射和元数​​据信息。

2 个答案:

答案 0 :(得分:1)

我认为您可能必须在保存之前将实体映射到新的Worker实体,以便实体框架不会查找对象的子类型 - Engineer。< / p>

例如:

public class Worker
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Name { get; set; }

    public static FromWorker(Worker worker)
    {
        // example of mapping the entity
        return new Worker
        {
            ID = worker.ID,
            Name = worker.Name,
        };
    }

    public bool Save(MyDatabase db)
    {
        try
        {
            Worker worker = Worker.FromWorker(this);

            if (db.Workers.Any(w => w.ID == worker.ID))
            {
                db.Workers.Attach(worker);
                db.Entry(worker).State = System.Data.Entity.EntityState.Modified;
            }
            else
            {
                db.Workers.Add(worker);
            }

            db.SaveChanges();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return false;
        }

        return true;
    }
}

答案 1 :(得分:0)

编辑:您已使用[NotMapped]
 我没有看到第一次抱歉。 所以我不希望它出现在模型中。

属性没有map属性 和整个班级的等效流利api选项。

[NotMapped] 
public string BlogCode  { get;set; }

和上下文中的POCO

public class MyDbContext : DbContext {
   protected override void OnModelCreating(DbModelBuilder modelBuilder) {

        //Tell EF not to include these in DB. Ignore these please
        // Anthing that EF picks and generates a table for that shoudl not be persisted
       // modelBuilder.Ignore<EFpleaseIgnoreMe>();
        modelBuilder.Ignore<YourType>();
    }
   }