如何在Code First流畅映射中创建所需的继承属性?

时间:2012-04-22 05:48:09

标签: entity-framework ef-code-first

我有以下设置,为简洁而删节:

public abstract class AuditableEntity
{
    public int Id { get; set; }
    public Login Login { get; set; }  // Login that create this identity.
}

public class Login: AuditableEntity
{
    public Security Security { get; set; }
    public Guid SessionGuid { get; set; }
}

public class Security: AuditableEntity
{
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
}

现在Login实体本身不需要Login。事实上,它不属于该表,因此我忽略它:

modelBuilder.Entity<Login>().Ignore(l => l.Login);

我想要在所有其他表格上按需要,但是当我尝试在User

上进行操作
modelBuilder.Entity<Security.Security>().Property(p => p.Login).IsRequired();

我收到编译错误,“类型'Login'必须是不可为空的值类型才能将其用作参数'T'”。我注意到我之前可以在Ignore调用中将它用作参数'T',所以我假设这是其他隐藏的T。

我明显的解决方案并不是很优雅:

  1. LoginAuditableEntity使用FK值而非参考资料。
  2. 创建一个没有Login的新基类,另一个派生自添加Login的基类,然后从最高基础继承我的Login类,并从其直接后代继承所有其他类。
  3. 有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

您正在使用本机SQL属性的属性语法。您实际上想要使用Nav属性语法,例如.HasRequired(t=>t.Login).WithMany()或类似的

请参阅http://msdn.microsoft.com/en-us/library/hh295843(v=vs.103).aspx配置与一个导航属性的关系部分