我有一个我的内容模型:
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
这与Property(() => p).HasDatabaseGeneratedOption()呼叫一起使用.或许是关闭默认的DB值生成?
entity-framework entity-framework-mapping entity-framework-5
好吧,可能这个问题之前已经得到了回答,但我一直在研究,我找不到解决我特定问题的方法
此示例的代码 - 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
我有这样的事情:
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
如果我有 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约束.无法创建约束.查看以前的错误.
我已经看过其中一些问题,但它们总是涉及一个导航属性和一个集合.这种关系也是单向的,但如果必须是双向的,可能是双向的,不确定是否重要.
我正在使用实体框架4.0我的方法是数据库第一种方法.在edmx中重命名列名或更改列的数据类型的最佳方法是什么.
提前致谢.
假设您向客户发送了一个新的应用程序版本,并且需要更新本地客户数据库,比如它是一个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)这项工作很好,但在实体框架中是否有任何真正内置的支持.
没有任何数据丢失!
如果是这样 - 你能否给出一些具体的例子,说明如何以正确的方式做到这一点.
非常感谢!