0

「Action」と「Permission」という 2 つのエンティティを使用して、Code First を使用してモデルを作成しています。

各アクセス許可は、1 つのアクションのみを指します。2 つのアクセス許可が同じアクションを指すことはできません。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

3 つの提案があります。最初の提案が機能するかどうかは試していません。

提案 #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);

それ以外は、主キーに int を使用していますが、それが要因になる理由がわかりません。

また、アクション w/oa Permission を使用できる場合、削除をカスケードする必要があるかどうかもわかりません。アクセス許可なしでアクションを取得できない場合は、(Has/With)Required 流れるようなマップを使用するか、CF が意図を解釈できるようにコードを明示的に構造化することによって、それを示す必要があります。

最初の 2 つの提案は後で試して、結果をお知らせします。

于 2012-11-07T20:59:07.507 に答える