[
https://issues.apache.org/jira/browse/CASSANDRA-7996?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Carl Yeksigian resolved CASSANDRA-7996.
---------------------------------------
Resolution: Invalid
Fix Version/s: (was: 2.1.0)
C# driver issues should be reported to the [DataStax C#
Jira|https://datastax-oss.atlassian.net/browse/CSHARP].
> Cassandra C# driver errors on virtual properties when using CreateIfNotExists
> method
> ------------------------------------------------------------------------------------
>
> Key: CASSANDRA-7996
> URL: https://issues.apache.org/jira/browse/CASSANDRA-7996
> Project: Cassandra
> Issue Type: Improvement
> Components: Drivers (now out of tree)
> Reporter: Thomas Atwood
>
> When using the Cassandra C# driver, I receive the error "An unhandled
> exception of type 'Cassandra.SyntxError' occurred in Cassandra.dll when
> attempting to create a table with an overridden property using the Linq
> functionality with the driver. If the property is not overriden, the driver
> creates the table without any issues.
> Example: concrete object inherits from abstract object where the Id field is
> virtual on the abstract object. Reason to override this field would be to
> apply certain regex validation for format depending on the derived concrete
> object (Id will still be unique across all objects that inherit from the
> abstract object).
> Abstract object:
> using System;
> using System.ComponentModel;
> using Cassandra.Data.Linq;
> namespace TestDatastaxCsDriver.Abstract
> {
> [AllowFiltering]
> [Serializable]
> public class AbstractEntity: INotifyPropertyChanged
> {
> private string _id;
> private string _name;
> private string _insertuser;
> private DateTime _insertimestamp;
> private DateTime _modifiedtimestamp;
> public event PropertyChangedEventHandler PropertyChanged;
> public AbstractEntity(string id, string name, string insertuser)
> {
> Id = _id;
> Name = _name;
> InsertUser = _insertuser;
> InsertTimestamp = DateTime.Now;
> ModifiedTimestamp = DateTime.Now;
> }
> [PartitionKey]
> [Column("id")]
> public virtual string Id
> {
> get { return _id; }
> set
> {
> if (value != _id)
> {
> _id = value;
> NotifyPropertyChanged("Id");
> }
> }
> }
> [Column("name")]
> public string Name
> {
> get { return _name; }
> set
> {
> if (value != _name)
> {
> _name = value;
> NotifyPropertyChanged("Name");
> }
> }
> }
> [Column("insertuser")]
> public string InsertUser
> {
> get { return _insertuser; }
> set
> {
> if (value != _insertuser)
> {
> _insertuser = value;
> NotifyPropertyChanged("InsertUser");
> }
> }
> }
> [Column("inserttimestamp")]
> public DateTime InsertTimestamp
> {
> get { return _insertimestamp; }
> set
> {
> if (value != _insertimestamp)
> {
> _insertimestamp = value;
> NotifyPropertyChanged("InsertTimestamp");
> }
> }
> }
> [Column("modifiedtimestamp")]
> public DateTime ModifiedTimestamp
> {
> get { return _modifiedtimestamp; }
> set
> {
> if (value != _modifiedtimestamp)
> {
> _modifiedtimestamp = value;
> NotifyPropertyChanged("ModifiedTimestamp");
> }
> }
> }
> private void NotifyPropertyChanged(String propertyName = "")
> {
> if (PropertyChanged != null)
> {
> PropertyChanged(this, new
> PropertyChangedEventArgs(propertyName));
> ModifiedTimestamp = DateTime.Now;
> }
> }
> }
> }
> Concrete object:
> using System.ComponentModel.DataAnnotations;
> using Cassandra.Data.Linq;
> using TestDatastaxCsDriver.Abstract;
> namespace TestDatastaxCsDriver.Concrete
> {
> [Table("issuer")]
> public class Issuer : AbstractEntity
> {
> public Issuer(string id, string name, string insertuser) : base(id,
> name, insertuser)
> {
> }
> //Cassandra C# driver chokes on this. No issues if the property is not
> overriden. Please note I also tried adding a column attribute to see if it
> fixed the problem and it did not.
> [MaxLength(3,ErrorMessage = "Id cannot be longer than 3 characters.")]
> public override string Id
> {
> get
> {
> return base.Id;
> }
> set
> {
> base.Id = value;
> }
> }
> }
> }
> Program.cs to test:
> using Cassandra;
> using Cassandra.Data.Linq;
> using TestDatastaxCsDriver.Concrete;
> namespace TestDatastaxCsDriver
> {
> class Program
> {
> static void Main(string[] args)
> {
> Cluster cluster =
>
> Cluster.Builder().AddContactPoint("127.0.0.1").WithCredentials("cassandra",
> "cassandra").Build();
> var session = cluster.Connect();
> session.CreateKeyspaceIfNotExists("test");
> session.ChangeKeyspace("test");
> var issuer = session.GetTable<Issuer>();
> issuer.CreateIfNotExists();
> }
> }
> }
> The request would be to allow for the CreateIfNotExists method to ignore the
> override keyword and to create the property with the type specified as long
> as the type is one of the types supported by the driver (e.g. string, int,
> bool, etc.).
> Please let me know if you need more sample code or additional clarification
> regarding this request.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)