0

我正在编写一个模型,使用 Code First,有两个实体:“Action”和“Permission”。

每个权限都指向一个操作。没有两个权限可以指向同一个操作。一个动作可能在没有被许可指向的情况下存在。

操作不应该知道权限。

我的代码是:

public Action
{
  public Guid Id {get; set;}
  public string Name {get; set;}
}

public Permission
{
  public Guid Id {get; set;}
  public string Name {get; set;}

  public Action Action {get; set;}
}

另外,我使用 Fluent API 配置了权限:

modelBuilder.Entity<Permission>.HasRequired(p => p.Action).WithOptional()
            .WillCascadeOnDelete();

当我尝试删除操作时,我收到以下错误:

“不允许添加与处于已删除状态的实体的关系”。

我尝试先删除权限,然后删除操作。为此,我需要获取给定操作 ID 的权限,但我收到此错误:

var permission = (from p in context.Permissions.Include(p => p.Action)
                  where p.Action.Id == actionId
                  select p).Single();

“不支持索引属性”

我究竟做错了什么?有没有更好的方法来模拟这个?

谢谢!尼尔

4

1 回答 1

0

三个建议,第一个没试过,看看是否有效:

建议 #1 将具有 FK 属性的外键添加到模型中,例如:

public Permission
{
  public Guid Id {get; set;}
  public string Name {get; set;}

  [ForeignKey("Action")]
  public int ActionId {get; set;}
  public Action Action {get; set;}
}

然后尝试:

var permission = (from p in context.Permissions.Include(p => p.Action)
              where p.ActionId == actionId
              select p).Single();

建议 #2 可以在这里找到:

EF 4.1:.WithMany() 和 .WithOptional() 之间的区别?

建议#3

我们有类似的模式,但我们让双方都了解对方。您是否有充分的理由不想在 Action 中包含 Permission 导航属性?您可以执行以下操作:

public Action
{
  public Guid Id {get; set;}
  public string Name {get; set;}

  // notice the FK is nullable 
  public int? PermissionId {get; set;}
  public Permission {get; set;}
}

以下是我们构建模型的方式,每个 Document 与 DocumentType 有 1..1 的关系:

public class Document 
{ 

#region " Mutually exclusive document type relationships, necessary for setting up shared primary key in db "
public BindingAgreement BindingAgreement { get; set; }
public CeoLetter CeoLetter { get; set; }
public Email Email { get; set; }
....   
#endregion
//other code
}

Public class BindingAgreement 
{
  public Document {get;set;}
  // other code
}

Public class CeoLetter 
{
  public Document {get;set;}
  // other code
}

Public class Email 
{
  public Document {get;set;}
  // other code
}

然后在我的模型构建器中我这样做:

  //Binding Agreement
  modelBuilder.Entity<BindingAgreement>().HasRequired(c => c.Document);

  //Ceo Letter
  modelBuilder.Entity<CeoLetter>().HasRequired(c => c.Document);

  //Email
  modelBuilder.Entity<Email>().HasRequired(c => c.Document);

除此之外,我使用整数作为我的主键,但我不明白为什么这是一个因素。

如果您可以拥有无​​权限的操作,我也不确定您是否需要删除级联。如果您不能拥有无 oa 权限的操作,则需要使用 (Has/With)Required fluent map 或通过以允许 CF 解释您的意图的方式显式构建代码来表明这一点。

稍后我将尝试前两个建议,并让您知道我的结果。

于 2012-11-07T20:59:07.507 回答