0

既存のスキーマへのコード最初のアプローチで、標準的な型ごとのテーブル継承のケースがあります。

[Table("base_object")]
public partial class BaseObject
{
  public BaseObject()
  { 

  }

  [Key]
  [Column("id")]
  public long Id {get; set;}
  [Column("slug")]
  public string Slug {get; set;}
  ...       
}

[Table("user")]
public partial class User: BaseObject
{
  public User()
  {

  }

  [Column("login")]
  public string Login {get; set;}
  [Column("email")]
  public string Email {get; set;}
}

注釈で説明されているように、マッピングは簡単です。user.id は主キーであり、base_object.id への外部キーです。

テスト ケースでは、Context から "Users" リポジトリへの最初の呼び出し中に、EF がクエリを生成しています。

SELECT 
1 AS [C1], 
'0X0X' AS [C2], 
[Extent1].[id] AS [id], 
[Extent2].[slug] AS [slug], 
[Extent1].[login] AS [login], 
[Extent1].[email] AS [email], 
[Extent1].[BaseObject_id] AS [BaseObject_id]
FROM  [dbo].[user] AS [Extent1]
INNER JOIN [dbo].[base_object] AS [Extent2] ON [Extent1].[id] = [Extent2].[id]

列「user.BaseObject_id」が存在しないため、エラーが発生します。この行がない場合: *[Extent1].[BaseObject_id] AS [BaseObject_id]* クエリは問題ありません。

私は何を間違っていますか?

.NET 4.0 で EF5.0 を使用しています

4

1 に答える 1

0

「...」が違いを生むことがわかりました。

BaseObjectコレクションがありました:

[InverseProperty("Object")]
public virtual ICollection<UserHasObjectRight> UserHasObjectRights { get; set; }

そしてUserコレクションを持っていました:

[InverseProperty("User")]
public virtual ICollection<UserHasObjectRight> UserHasObjectRights { get; set; }

奇妙なクエリ生成を引き起こしていました。ベースオブジェクトクラスから重複するコレクションを削除する必要があり、機能し始めました。

于 2013-02-01T07:07:14.970 に答える