0

我有以下设置,为简洁起见进行了删节:

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. Login对in使用 FK 值而不是参考属性AuditableEntity
  2. 创建一个没有 的新基类Login,另一个派生自添加的基类Login,然后从最高基类继承我的 Login 类,并从其直接后代继承所有其他类。

有没有更好的方法来做到这一点?

4

1 回答 1

1

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

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

于 2012-04-22T05:55:55.283 回答