我有以下设置,为简洁而删节:
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。
我明显的解决方案并不是很优雅:
Login
中AuditableEntity
使用FK值而非参考资料。Login
的新基类,另一个派生自添加Login
的基类,然后从最高基础继承我的Login类,并从其直接后代继承所有其他类。有没有更好的方法呢?
答案 0 :(得分:1)
您正在使用本机SQL属性的属性语法。您实际上想要使用Nav属性语法,例如.HasRequired(t=>t.Login).WithMany()
或类似的
请参阅http://msdn.microsoft.com/en-us/library/hh295843(v=vs.103).aspx和配置与一个导航属性的关系部分