标签: entity-framework-mapping

ASP.NET EF从未映射的类中删除了鉴别器列

我有一个我的内容模型:

class BaseModel {
    public virtual string Content{ get; set; }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

要仅显示数据,上面的模型就可以了.但我想添加编辑内容的功能.所以我需要为成员内容添加一个属性- 但这只应该在autor按下编辑按钮时发生,而不是在内容的常规视图中.

所以我创建了第二个继承BaseModel的模型,以便我可以用我的属性覆盖成员:

class EditableBaseModel : BaseModel {
    [UIHint("MyEditor"), AllowHtml]
    public override string Content{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但由于继承,EF会创建一个额外的列鉴别器.它包含类的类型作为字符串.在我的情况下,它始终是BaseModel,因为我总是将EditableBaseModel转换为BaseModel,然后将它保存到数据库,如下所示:

myBbContextInstance.BaseModels.Add(editableBaseModelInstance as EditableBaseModel);
Run Code Online (Sandbox Code Playgroud)

因此,鉴别器列是浪费空间,我想删除它.我发现这可以使用NotMapped属性来完成.但是当我尝试保存模型时,这将导致以下异常:

无法找到EntityType'EditableBaseModel'的映射和元数​​据信息.

似乎NotMapped属性将让EF知道存在从BaseModel继承的另一个类,但EF不会获得有关此类的任何信息.但那不是我想要的.我需要告诉EF:EditableBaseModel不应该关心它,因为它只适合我的视图,并且永远不会用于数据库.

我怎样才能做到这一点?我发现的唯一方法是手动将EditableBaseModel实例转换为BaseModel对象,如下所示:

public ActionResult Save(EditableBaseModel editableBaseModel) {
    var baseModel = new BaseModel() {
        Content = editableBaseModel.Content
        // ...
    };
    myDbContextInstance.BaseModels.Add(baseModel); …
Run Code Online (Sandbox Code Playgroud)

c# asp.net inheritance entity-framework entity-framework-mapping

14
推荐指数
2
解决办法
1689
查看次数

为什么存在`DatabaseGeneratedOption.None`?

这与Property(() => p).HasDatabaseGeneratedOption()呼叫一起使用.或许是关闭默认的DB值生成?

entity-framework entity-framework-mapping entity-framework-5

12
推荐指数
1
解决办法
2万
查看次数

EntityFramework 5 Code First多重继承映射(TPC)

好吧,可能这个问题之前已经得到了回答,但我一直在研究,我找不到解决我特定问题的方法

此示例的代码 - Visual Studio 2012 - 控制台应用程序

所以我有一个带有多个继承对象的EntityFramework Code First模型.我创建了这个代表我的问题的例子:

模型

public abstract class Person
{
    [Key]
    public Guid PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public decimal BaseSalary { get; set; }
}

public class ExecutiveEmployee : Employee
{
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

上下文

public class MyContext : DbContext
{
    public DbSet<Employee> Employees { get; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework ef-code-first entity-framework-mapping entity-framework-5

8
推荐指数
1
解决办法
6110
查看次数

EF 6 - 级联删除一对多,无需反向引用

我有这样的事情:

public class Gadget {
  public int Id { get; set; }
  public string Name { get; set;}
  public int SuperHeroId { get; set; }
}

public class SuperHero {
  public int Id { get; set; }
  public virtual ICollection<Gadget> Gadgets { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然小工具由超级英雄"拥有"(因此数据库中有一个FK),但我的域模型在该方向上没有硬引用.

当我删除超级英雄时,我也想删除他们的所有小工具.我该怎么做?

我的研究表明,如果我有这样的参考,那将是类似的

mapping.Entity<SuperHero>()
  .HasMany(x => x.Gadgets)
  .WithRequired(x => x.SuperHero) //this is the part I can't do
  .WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)

但如上所述,这不适用于我的域模型.

.net orm entity-framework entity-framework-mapping entity-framework-6

7
推荐指数
1
解决办法
6789
查看次数

EF Code First,将两个导航属性映射到同一对象类型

如果我有 User具有以下属性类:

    public Guid UserPreferenceId { get; set; }
    public virtual DefaultUserPreference UserPreference { get; set; }

    public Guid SecondaryUserPreferenceId { get; set; }
    public virtual DefaultUserPreference SecondaryUserPreference { get; set; }
Run Code Online (Sandbox Code Playgroud)

如何通过流畅的API获取此信息?当我尝试运行它时,它说:

在表'Users'上引入FOREIGN KEY约束可能会导致循环或多个级联路径.指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束.无法创建约束.查看以前的错误.

我已经看过其中一些问题,但它们总是涉及一个导航属性和一个集合.这种关系也是单向的,但如果必须是双向的,可能是双向的,不确定是否重要.

entity-framework ef-code-first entity-framework-mapping

5
推荐指数
1
解决办法
2268
查看次数

在edmx中重命名列的最佳方法是什么?

我正在使用实体框架4.0我的方法是数据库第一种方法.在edmx中重命名列名或更改列的数据类型的最佳方法是什么.

提前致谢.

sql-server edmx entity-framework-mapping

3
推荐指数
1
解决办法
1272
查看次数

是否以编程方式在Entity Framework中支持自动更新数据库?(没有任何数据丢失)

假设您向客户发送了一个新的应用程序版本,并且需要更新本地客户数据库,比如它是一个SQL microsoft数据库2008.

  • 现在我通过数据库中的版本表执行此操作,并运行sql脚本. - 匹配该版本,如:

        if (DatabaseVersion < Common_func.ProgramDBFixVersion)
        {
            switch (DatabaseVersion)
            {
                case 0:
                    if (Fix0() == false) NoErrorFixFlg = false;
                    goto case 1;
    
                case 1:
                    if (Fix1() == false) NoErrorFixFlg = false;
                    goto case 2;
                    .  
                    .
                    .
    
    private static bool Fix1()
    {
    
        try
        {
            var conn = new SqlConnection(Utils.ConnectionString);
            conn.Open();
            ExecSql(conn, "ALTER TABLE Customer ADD Is_Deleted [bit] NULL");
            conn.Close();
        }
        catch (Exception ex)
        {
          retrun false;
        }
        return true;
    }
    
    Run Code Online (Sandbox Code Playgroud)

这项工作很好,但在实体框架中是否有任何真正内置的支持.

没有任何数据丢失!

如果是这样 - 你能否给出一些具体的例子,说明如何以正确的方式做到这一点.

非常感谢!

c# sql entity-framework-mapping

0
推荐指数
1
解决办法
1509
查看次数