成员结构属性作为EF中的主键

时间:2015-01-23 05:44:55

标签: c# entity-framework ef-code-first primary-key

我们说我有以下代码:

public class TenantId
{
   public Guid Id { get; protected set; }

   public TenantId(Guid id)
   {
      Id = id;
   }
}

public class Tenant
{
   public TenantId Id { get; protected set; }
   public string Name { get; set; }

   public Tenant(TenantId id, string name)
   {
      Id = id;
      Name = name;
   }
}

有没有办法将TenantId映射为Entity Framework Code First中的Guid主键?

我尝试了以下内容:

modelBuilder.Entity<Tenant>()
   .HasKey(m => m.Id );

modelBuilder.Entity<Tenant>()
   .HasKey(m => m.Id.Id );

两者都编译,但都抛出运行时异常。前者说它是无效的类型(必须是标量,字符串或字节[])。后者抱怨表达无效,因为不是财产。

我还尝试添加从TenantId到Guid的隐式转换,没有运气,

2 个答案:

答案 0 :(得分:1)

实体框架仅支持标量类型,字符串和byte []作为主键。您可以在Tenant类中移动属性Guid Id的最佳选择。如果您需要执行某些逻辑或使用密钥,那么您可以将此逻辑放在EntityBase类中,这是父租户:

public class EntityBase
{
    public Guid Id { get; protected set; }

    //logic with Id
}

public class Tenant : EntityBase
{
     public string Name { get; set; }
}

答案 1 :(得分:-1)

我在这里找到了一种解决方案:https://www.devexpress.com/Support/Center/Question/Details/T141713

  • 在租户类中添加冗余字符串ID。
  • 修改Id属性的get和set方法。

它工作但域实体会得到一些冗余的代码行。有没有人试图修改'dbcontext'的映射过程或更改EF的源代码?