0

我正在对我们的 EF 模型进行一些复杂的修改(我们使用代码优先),我知道它应该以特别和可测试的方式影响我的数据库;例如,我应该能够断言;

The db will have an 'Item' table
'Item' will have an integer 'Id' field which is the primary key
'Item' will have a 50-character string 'Name' field

这些对于单元测试来说已经成熟了,但是我找不到测试这些断言的方法。

我想要的是一种从 中获取数据库模型的方法DbContext,这样我就可以做类似的事情;

var model = BuildModel(MyEntityContext);

var itemTable = model.Db.Tables["Item"]

Assert.IsNotNull(itemTable);
Assert.IsTrue(itemTable.Columns["Id"] != null);
Assert.IsTrue(itemTable.Columns["Name"] != null);
Assert.IsTrue(itemTable.Columns["Name"].Length == 50);
...

有谁知道获取DbContext对象隐含的数据库结构描述的方法?

4

1 回答 1

2

你可以从这样的事情开始......看看这是否能把你带到任何地方。

using(ObjectContext context = new ObjectContext())  
{
var queryResult = from meta in context.MetadataWorkspace.GetItems(DataSpace.CSpace)
                  .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
                  from p in (meta as EntityType).Properties
                  .Where(p => p.DeclaringType.Name == context.GetType().Name
                  && p.Name == PropertyName
                  Select new {Length = p.TypeUsage.Facets["MaxLength"].Value, Name=p.TypeUsage.Facets["Name"].Value, p.TypeUsage.Facets["FacetType"].Value 
}

(@steve-cooper) 一个非常有帮助的开始!谢谢。我根据你的建议提出了一个工人阶级——我把它贴在这里,这样我就可以给你接受的答案,这样其他人就可以看到经过处理的代码。

    public class ModelSummary
    {
        public Dictionary<string, System.Data.Metadata.Edm.EntityType> Entities { get; private set; }

        public static ModelSummary Load(DbContext context)
        {
              var adapter = (IObjectContextAdapter)context;
              var objectContext = adapter.ObjectContext;

                var summary = new ModelSummary();

              var items = objectContext.MetadataWorkspace.GetItems(DataSpace.SSpace);

              summary.Entities =
                objectContext.MetadataWorkspace.GetItems(DataSpace.SSpace)
                .OfType<EntityType>()
                .ToDictionary(et => et.Name);

            return summary;

        }

        public bool EntityExists(string entityName)
        {
            return this.Entities.ContainsKey(entityName);
        }

        public bool EntityHasProperty(string entityName, string propertyName)
        {
            if (!EntityExists(entityName))
            {
                return false;
            }

            var entity = this.Entities[entityName];

            return entity.Properties.Contains(propertyName);
        }
    }

测试看起来像这样;

    [Test]
    public void Context_SchemaIsExpected()
    {
        var summary = ModelSummary.Load(new MyContext());
        Assert.IsTrue(summary.EntityExists("Item"));
        Assert.IsTrue(summary.EntityHasProperty("Item", "Id"));
    }
于 2013-09-26T15:30:26.753 回答